1402. 做菜顺序
题目来源:力扣(LeetCode)
https://leetcode-cn.com/problems/reducing-dishes/
解题思路:
做菜顺序可以是任意的,并且可以删除任意道菜。我们就将数组元素进行从小到大排序,最大的元素放在最后面,那么所经历的时间就越大,就能够以最大的方式得到最大的满意度。
那么从排序后的最后一个元素开始遍历排序后的数组stisfaction。当遍历第n个元素时,若stisfaction[n-1]>0,则当前元素可以得到更大的满意度;当遍历第n-1个元素时,第n个元素的时间加一个单位,此时满意度为stisfaction[n-1]+(stisfaction[n-2]+stisfaction[n-1])((stisfaction[n-2]+stisfaction[n-1]))为当前元素的加入所得到满意度的增量),若加入的元素能够得到更大的满意度,则要满足的条件为 stisfaction[n-1] +(stisfaction[n-2]+stisfaction[n-1])> stisfaction[n-1],即stisfaction[n-2]+stisfaction[n-1]>0。可以理解为只要加入的元素的总和大于0,就可以得到更大的满意度。一直重复上诉操作。
代码:
public int maxSatisfaction(int[] satisfaction) {
// 首先对数组进行排序
Arrays.sort(satisfaction);
int n = satisfaction.length;
// 最大元素小于0,最大满意度为0
if (satisfaction[n-1] <= 0){
return 0;
}
int ceils = 0;
int maxSatis = 0;
// 从数组的最大元素开始遍历数组元素
for (int i = n-1; i >= 0; i--) {
if(ceils + satisfaction[i] > 0){
// 加入元素后的满意度增量
ceils += satisfaction[i];
// 得到最大满意度
maxSatis += ceils;
}
}
return maxSatis;
}