由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 练练DP吧,呵呵
相关主题
select k to maximize the minimumGiven an array of N integers from range [0, N] and one is missing. Find the missing number.
问道题,谁给个效率高点的解法面试题
出道题。perfectPermutationGroupon 電面
liverampOA题目请教一个数组题
这题怎么做?请问这个3sumClosest
一道面试算法题求教一道DP的面试题,minimum adjustment cost
一道面试题问个面试题
MS onsite 归来,新鲜面经,巨长,顺便求祝福请教一道Google面试题
相关话题的讨论汇总
话题: int话题: sum话题: records话题: diff话题: array
进入JobHunting版参与讨论
1 (共1页)
H***e
发帖数: 476
1
两个题目
1.
Given an array of integers, find out number of ways in which you can select
increasing subsequences of length k(k<=n).e.g.array is 1 4 6 2 5 & k=3 then
the answer is : 1 4 5, 1 2 5,1 4 6, 1 2 6,所以总数是4
2.
Given a sorted array of n integers, pick up k elements so that the minimal
difference between consecutive elements is maximized (that is choose the
elements to maximize the quantity min(a[i+1] - a[i]))
s******n
发帖数: 3946
2
第一题:(修订后)
n*k的matrix,m(i,k)表示第i个元素结尾,长度为k的结果个数
m(i,k) = sum{m(j,k-1), where a[j] 得O(k*n^2),有更好的办法么?
s******n
发帖数: 3946
3
第二题,搞个升序的dequeue, dequeue[0]表示当前k个连续元素最小difference。
每来一个元素diff[i],把dequeue上所有比diff[i]大的扔掉,如果dequeue[0]=diff[i
-k]则把dequeue[0]也扔掉。
A**u
发帖数: 2458
4
你的dp水平真不是盖的

【在 s******n 的大作中提到】
: 第二题,搞个升序的dequeue, dequeue[0]表示当前k个连续元素最小difference。
: 每来一个元素diff[i],把dequeue上所有比diff[i]大的扔掉,如果dequeue[0]=diff[i
: -k]则把dequeue[0]也扔掉。

i**d
发帖数: 357
5
第二题可以用binary search来做。lo = 0, high = (a[len-1]-a[0])/(k-1)+1
然后 对于任意一个Mid,考察是否存在k个数,使得minimum的值大于等于mid。
s******n
发帖数: 3946
6
给个解法吧,我这抛砖引玉

【在 A**u 的大作中提到】
: 你的dp水平真不是盖的
A**u
发帖数: 2458
7
这好像不对吧
m(i,k) 不是以 第i个元素结尾
m(i,k) 应该是 sum{m(j,k-1),where a[j]
【在 s******n 的大作中提到】
: 给个解法吧,我这抛砖引玉
s******n
发帖数: 3946
8
恩。不过这样是O(k*n^2),有更好的做法吗?

【在 A**u 的大作中提到】
: 这好像不对吧
: m(i,k) 不是以 第i个元素结尾
: m(i,k) 应该是 sum{m(j,k-1),where a[j]
s****a
发帖数: 528
9
第二题好像是GREEDY,不用DP
H***e
发帖数: 476
10
我做法跟swanswan一样,只不过M[i,k]定义要改成 前i个元素里符合条件的长度为k的
子数组数目。
为啥第一项没有了? M[i-1,k] 不是分成以a[i]结尾和不以a[i]结尾两种情况吗?

【在 A**u 的大作中提到】
: 这好像不对吧
: m(i,k) 不是以 第i个元素结尾
: m(i,k) 应该是 sum{m(j,k-1),where a[j]
相关主题
一道面试算法题Given an array of N integers from range [0, N] and one is missing. Find the missing number.
一道面试题面试题
MS onsite 归来,新鲜面经,巨长,顺便求祝福Groupon 電面
进入JobHunting版参与讨论
H***e
发帖数: 476
11
第二题,
定义M[i,k]为以a[i]为结尾的,长度为k的符合条件的,则
M[i,k] = max_over_j( min ( M[j,k-1], a[i] -a[j]) ) , 0 帮看看有问题么?

select
then

【在 H***e 的大作中提到】
: 两个题目
: 1.
: Given an array of integers, find out number of ways in which you can select
: increasing subsequences of length k(k<=n).e.g.array is 1 4 6 2 5 & k=3 then
: the answer is : 1 4 5, 1 2 5,1 4 6, 1 2 6,所以总数是4
: 2.
: Given a sorted array of n integers, pick up k elements so that the minimal
: difference between consecutive elements is maximized (that is choose the
: elements to maximize the quantity min(a[i+1] - a[i]))

H***e
发帖数: 476
12
怎么greedy呢》

【在 s****a 的大作中提到】
: 第二题好像是GREEDY,不用DP
s******n
发帖数: 3946
13
你这个定义有问题,推不出M[i,k]=sum{M[j,k-1] a[j]
【在 H***e 的大作中提到】
: 我做法跟swanswan一样,只不过M[i,k]定义要改成 前i个元素里符合条件的长度为k的
: 子数组数目。
: 为啥第一项没有了? M[i-1,k] 不是分成以a[i]结尾和不以a[i]结尾两种情况吗?

i*o
发帖数: 149
14
第一题:
"where a[j] can be improved to:
"where a[j] And when k is close to n, the complexity is close to O(n^2) instead of
O(n^3
).
How should we describe this in O notion?

【在 s******n 的大作中提到】
: 恩。不过这样是O(k*n^2),有更好的做法吗?
x********3
发帖数: 160
15
第二题我想是可以用greedy的。我基本的思路是首尾两项肯定是在选的elements中的。
初始化是选择的序列是0,1,2..k-2,n-1(从0开始计)。循环从倒数第二项开始决定他
应该所在的index的位置,直到正数第二项为止。中间的调整的过程有点复杂,可能可
以简化。下面是我随便写的代码。写得蛮差的,欢迎大家测试指正。
$k = 4;
$a = Array(1, 2, 5, 6, 11, 16, 17);
$records = Array();
for ($i = 1; $i < $k - 1; $i++)
{
$record = new Record($a[$i] - $a[$i - 1], $i);
$records[$i - 1] = $record;
}
$records[$k - 2] = new Record($a[count($a) - 1] - $a[$k - 2], count($a) - 1);
for ($last = $k - 2; $last > 0; $last--)
{
for ($i = $records[$last - 1]->index + 1; $i < $records[$last]->index; $
i++)
{
$newDiff = $a[$i] - $a[$records[$last - 1]->index];
$minDiff = PHP_INT_MAX;
$minIndex;
for ($j = 0; $j <= $last - 1; $j++)
{
if ($records[$j]->diff < $minDiff)
{
$minIndex = $j;
$minDiff = $records[$j]->diff;
}
}
$tmp = $a[$records[$last]->index] - $a[$i];
if ($tmp > $minDiff)
{
if ($newDiff > $minDiff)
{
array_splice($records, $last, 0, array(new Record($newDiff,
$i)));
$records[$minIndex + 1]->diff += $records[$minIndex]->diff;
array_splice($records, $minIndex, 1);
$records[$last]->diff = $tmp;
}
else
{
$records[$last - 1]->index = $i;
$records[$last - 1]->diff += $newDiff;
$records[$last]->diff = $tmp;
}
}
}
}
printf("0\n");
foreach ($records as $record) printf("%d\n", $record->index);
class Record
{
public $diff;
public $index;
public function __construct($diff, $index)
{
$this->diff = $diff;
$this->index = $index;
}
}

select
then

【在 H***e 的大作中提到】
: 两个题目
: 1.
: Given an array of integers, find out number of ways in which you can select
: increasing subsequences of length k(k<=n).e.g.array is 1 4 6 2 5 & k=3 then
: the answer is : 1 4 5, 1 2 5,1 4 6, 1 2 6,所以总数是4
: 2.
: Given a sorted array of n integers, pick up k elements so that the minimal
: difference between consecutive elements is maximized (that is choose the
: elements to maximize the quantity min(a[i+1] - a[i]))

l***n
发帖数: 37
16
why not 2 4 5, 2 4 6....etc..??
if no, then why is 1 2 6 an answer?
1 2 6 is not in subseq order. I don't get the last output for the first
problem.

select
then

【在 H***e 的大作中提到】
: 两个题目
: 1.
: Given an array of integers, find out number of ways in which you can select
: increasing subsequences of length k(k<=n).e.g.array is 1 4 6 2 5 & k=3 then
: the answer is : 1 4 5, 1 2 5,1 4 6, 1 2 6,所以总数是4
: 2.
: Given a sorted array of n integers, pick up k elements so that the minimal
: difference between consecutive elements is maximized (that is choose the
: elements to maximize the quantity min(a[i+1] - a[i]))

H***e
发帖数: 476
17
sorry typo
已改

【在 l***n 的大作中提到】
: why not 2 4 5, 2 4 6....etc..??
: if no, then why is 1 2 6 an answer?
: 1 2 6 is not in subseq order. I don't get the last output for the first
: problem.
:
: select
: then

i*******h
发帖数: 216
18
首尾两项肯定是在选的elements中的 ==> 这是错误的。
比方说选3个from 2,3,4,6,8,9,
选择2,6,9和3,6,9一样,minimal difference between consecutive elements
都是3.

【在 x********3 的大作中提到】
: 第二题我想是可以用greedy的。我基本的思路是首尾两项肯定是在选的elements中的。
: 初始化是选择的序列是0,1,2..k-2,n-1(从0开始计)。循环从倒数第二项开始决定他
: 应该所在的index的位置,直到正数第二项为止。中间的调整的过程有点复杂,可能可
: 以简化。下面是我随便写的代码。写得蛮差的,欢迎大家测试指正。
: : $k = 4;
: $a = Array(1, 2, 5, 6, 11, 16, 17);
: $records = Array();
: for ($i = 1; $i < $k - 1; $i++)
: {

c**********e
发帖数: 2007
19
Is there a final conclusion for 1?

select
then

【在 H***e 的大作中提到】
: 两个题目
: 1.
: Given an array of integers, find out number of ways in which you can select
: increasing subsequences of length k(k<=n).e.g.array is 1 4 6 2 5 & k=3 then
: the answer is : 1 4 5, 1 2 5,1 4 6, 1 2 6,所以总数是4
: 2.
: Given a sorted array of n integers, pick up k elements so that the minimal
: difference between consecutive elements is maximized (that is choose the
: elements to maximize the quantity min(a[i+1] - a[i]))

x********3
发帖数: 160
20
虽然这两个是一样的,但是你还是可以选择2,6,9,不是?题目只是说让你选择k个
elements就可以了。

【在 i*******h 的大作中提到】
: 首尾两项肯定是在选的elements中的 ==> 这是错误的。
: 比方说选3个from 2,3,4,6,8,9,
: 选择2,6,9和3,6,9一样,minimal difference between consecutive elements
: 都是3.

H***e
发帖数: 476
21
我说的是你修改前的
用我的定义是有第二项的,也就是你删除的。
其实两个定义很象,复杂度也一样。

【在 s******n 的大作中提到】
: 你这个定义有问题,推不出M[i,k]=sum{M[j,k-1] a[j]
H***e
发帖数: 476
22
编了下method 1(swanswan说的 ) and method 2(我说的),
没太狂调。
/*
* Given an array of integers, find out number of ways in which you can
* select increasing subsequences of length K(K<=n).e.g.array is 1 4 6 2
5 &
* K=3 then the answer is : 1 4 5, 1 2 5,1 4 6, so total is 3
*/
// define M[i,k] is the # of k-length sequences that ends at i, i.e.
that sunseq ends at i.
public int numOfIncreasingSubSeq(int[] data, int K) {
// boundary
if (data == null || data.length == 0) {
return 0;
}
int[][] M = new int[data.length][K + 1];
// initialization
for (int t = 0; t < data.length; t++) {
for (int f = 0; f <= K; f++) {
M[t][f] = 0;
if (f == 1) {
M[t][f] = 1;
}
}
}
for (int i = 1; i < data.length; i++) {
for (int k = 2; k <= K; k++) {
int sum = 0;
for (int q = 0; q < i; q++) {
if (data[q] < data[i]) {
sum = sum + M[q][k - 1];
}
}
M[i][k] = sum;
}
}
int result = 0;
for (int p = 0; p < data.length; p++) {
result = result + M[p][K];
}
return result;
}
//method 2
// define M[i,k] is the # of length-k sub sequences within a sunstring
// ending at i(the increasing subseq not necessarily ends at i)
public int numOfIncreasingSubSeq2(int[] data, int K) {
// boundary
if (data == null || data.length == 0) {
return 0;
}
int[][] M = new int[data.length][K + 1];
// initialization
for (int t = 0; t < data.length; t++) {
for (int f = 0; f <= K; f++) {
M[t][f] = 0;
if (f == 1) {
M[t][f] = t + 1;
}
}
}
for (int i = 1; i < data.length; i++) {
for (int k = 2; k <= K; k++) {
if (k > i + 1) {
continue;
}
int sum = 0;
//the result comes from two parts: the subseq ends at i, or
not;
for (int b = 0; b < i; b++) {
sum = sum + M[b][k];
}
for (int q = 0; q < i; q++) {
if (data[q] < data[i]) {
sum = sum + M[q][k - 1];
}
}
M[i][k] = sum;
}
}
return M[data.length - 1][K];
}

【在 c**********e 的大作中提到】
: Is there a final conclusion for 1?
:
: select
: then

1 (共1页)
进入JobHunting版参与讨论
相关主题
请教一道Google面试题这题怎么做?
问一下那道买卖股票的题目一道面试算法题
请问G一题一道面试题
zenefits店面(已挂)MS onsite 归来,新鲜面经,巨长,顺便求祝福
select k to maximize the minimumGiven an array of N integers from range [0, N] and one is missing. Find the missing number.
问道题,谁给个效率高点的解法面试题
出道题。perfectPermutationGroupon 電面
liverampOA题目请教一个数组题
相关话题的讨论汇总
话题: int话题: sum话题: records话题: diff话题: array