33,010
社区成员
发帖
与我相关
我的任务
分享
/**
* 思路:三维dp看不懂。。。
* 1。遍历数组获得每个元素向前的最大差值;
* 2。遍历差值集,寻找逆序。如果出现逆序,此逆序对之间截断:
* a. 逆序对前元素为前一段的最大收益值;
* b。逆序对后元素为后一段的阶梯,在后一段出现新逆序之前,收益值为当前元素 - 阶梯;
* c。如果差值集尾部未出现逆序,则尾部元素 - 阶梯为最后的最大收益值;
* 3。将各分段最大收益值排序,取前limited位sum即为结果;
*/
@TestTimmer
public static int method_0(Integer[] prices, Integer limited) {
int result = 0;
if(Objects.nonNull(prices) && prices.length > 0 && limited > 0) {
//先计算出所有元素的最大差值;
int[] temp = new int[prices.length];
//之前的最小元素;
int min = prices[0];
for(int i = 1; i < prices.length; i++) {
min = Math.min(min, prices[i]);
temp[i] = prices[i] - min;
}
//遍历最大差值,发现逆序出现则截断,将最大值计入数组;
int[] results = new int[prices.length >> 1];
min = 0;
int step = 0;
for(int j = 1; j < temp.length; j++) {
//出现逆序;
if(temp[j] < temp[j - 1]) {
results[min] = temp[j - 1] - step;
min++;
step = temp[j];
} else if(j == temp.length - 1) {
results[min] = temp[j] - step;
break;
}
}
//计算最大值;
if(limited >= results.length) {
result = IntStream.of(results).sum();
} else {
Arrays.sort(results);
for(int k = results.length - 1; k > results.length - limited - 1; k--) {
result += results[k];
}
}
}
return result;
}