从前向后扫描一遍,生成数组c[]。基本上就是记录当前遇到过的最小a值, 然后对每个b[i]算差值,存到c[i]中。列一下伪代码可能清楚一点,生成 数组d的过程类似。 就是利用经典的买卖股票问题(一买一卖) int min = MAX_INT; int diff = 0; for (int i=0; i< k; i++) { if (a[i] < min) min = a[i];
if (b[i] - min > diff) diff = b[i] - min; c[i] = diff; }
h*n
10 楼
“买卖”是O(n)。 “买卖买卖”O(n^2)很容易,但O(n)怎么做到?
【在 m**q 的大作中提到】 : 从前向后扫描一遍,生成数组c[]。基本上就是记录当前遇到过的最小a值, : 然后对每个b[i]算差值,存到c[i]中。列一下伪代码可能清楚一点,生成 : 数组d的过程类似。 : 就是利用经典的买卖股票问题(一买一卖) : int min = MAX_INT; : int diff = 0; : for (int i=0; i< k; i++) { : if (a[i] < min) : min = a[i]; :
int EarnMost(int prices[], int len){ if (!prices !! len < 1) return 0; int minp = prices[0]; int maxp = prices[0]; int ret = 0; for (int i = 1; i < len; ++i){ if (prices[i] > maxp){ maxp = prices[i]; ret = maxp - minp > ret? maxp - minp:ret; }else if (prices[i] < minp){ minp = prices[i]; maxp = prices[i]; } } return ret; } if [5,4,3,2,1], it returns 0, not -1.
【在 s*******f 的大作中提到】 : int EarnMost(int prices[], int len){ : if (!prices !! len < 1) : return 0; : int minp = prices[0]; : int maxp = prices[0]; : int ret = 0; : for (int i = 1; i < len; ++i){ : if (prices[i] > maxp){ : maxp = prices[i]; : ret = maxp - minp > ret? maxp - minp:ret;