【每日一题Day355】LC1402 做菜顺序 | 贪心+排序

文章描述了一个厨师如何通过优化做菜顺序来最大化like-time系数的问题,采用贪心策略,即先做满意度高的菜,对满意度负数的菜进行选择性安排。算法的时间复杂度为O(nlogn),空间复杂度为O(logn)。
摘要由CSDN通过智能技术生成

做菜顺序【LC1402】

一个厨师收集了他 n 道菜的满意程度 satisfaction ,这个厨师做出每道菜的时间都是 1 单位时间。

一道菜的 「 like-time 系数 」定义为烹饪这道菜结束的时间(包含之前每道菜所花费的时间)乘以这道菜的满意程度,也就是 time[i]*satisfaction[i]

返回厨师在准备了一定数量的菜肴后可以获得的最大 like-time 系数 总和。

你可以按 任意 顺序安排做菜的顺序,你也可以选择放弃做某些菜来获得更大的总和。

  • 思路

    • 贪心:
      • 为了获得最大的 like-time 系数 总和,应按照满意度升序做菜;
      • 满意度大的最后再做;
      • 满意度为负数的菜,可以选择做或者不做。
    • 排序后倒序遍历,增加一道菜like-time系数变化量为:satisfaction[i] +…+ satisfaction[n-1],如果大于0,那么可以使 like-time 系数 总和增加,那么选择做这道菜
  • 实现

    class Solution {
        public int maxSatisfaction(int[] satisfaction) {
            
            // 贪心:为了获得最大的 like-time 系数 总和,应按照满意度升序做菜;满意度大的最后再做;满意度为负数的菜,可以选择做或者不做
            // 大于等于0的菜必做,然后选择负数的菜作为第一道菜,看其能否使like-time系数
            // 排序后倒序遍历:每增加一道菜like-time系数变化量为:satisfaction[i] +....+ satisfaction[n-1]
            Arrays.sort(satisfaction);
            int n = satisfaction.length;
            if (satisfaction[n - 1] <= 0) return 0;
            int sum = 0, res = 0;
            for (int i = n - 1; i >= 0; i--){
                sum += satisfaction[i];
                if (sum > 0){
                    res += sum;
                }else{
                    break;
                }
            }
            return res;
           
        }
    }
    
    • 复杂度
      • 时间复杂度: O ( n log ⁡ n ) O(n \log n) O(nlogn)
      • 空间复杂度: O ( log ⁡ n ) O(\log n) O(logn)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值