leetcode 1402. 做菜顺序 —— 贪心算法

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值