• [LeetCode84双周赛] [模拟] 6174. 任务调度器 II,[贪心&数学] 6144. 将数组排序的最少替换次数


    LeetCode 6174. 任务调度器 II

    https://leetcode.cn/problems/task-scheduler-ii/
    这道题一开始我模拟做,超时了😂,参考别人的题解,发现一些步骤上可以简化的。

    版本 1

    class Solution {
    public:
        long long taskSchedulerII(vector<int>& tasks, int space) {
            unordered_map<int, long long> hash;
            long long ans = 0;
            
            for (auto & x : tasks) {
    	       // 若没有做过同一类型的任务,或者中间间隔天数满足 space,ans 结果加一天
               if (hash[x] == 0 || ans - hash[x] > space) { 
                   ans++;
               // 否则,将 ans 赋值为上一次同一类型的任务的日子 + space 时间间隔 + 1
               } else {
                   ans = hash[x] + space + 1;
               }
               // 最后将该类型任务日子变为当前的 ans 的日子
               hash[x] = ans;
            }
            return ans;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    版本 2

    class Solution {
    public:
        long long taskSchedulerII(vector<int>& tasks, int space) {
            unordered_map<int, long long> hash;
            long long ans = 0;
            
            for (auto & x : tasks) {
                ans++;  // 完成该任务,天数+1
                if (hash[x] != 0) {
                    ans = max(ans, hash[x] + space + 1);  // 看看是否要间隔 space 天
                }
                hash[x] = ans; // 记录完成任务的时间
            }  
            return ans;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    LeetCode 6144. 将数组排序的最少替换次数

    https://leetcode.cn/problems/minimum-replacements-to-sort-the-array/
    因为最后的数组要满足递增,所以最后一个不要拆!如果最后一个拆了,前面拆的次数也会变多。

    从后往前遍历,维护拆完后的数组中的最小值 minValue
    nums[i] > minValue,对 nums[i] 进行拆分,怎么拆?

    • 拆出来的最大值 >= minValue
    • 拆出来地最小份数 k = ⌈ n u m s [ i ] m i n V a l u e ⌉ \lceil \frac{nums[i]}{minValue} \rceil minValuenums[i],拆的次数为 k - 1
    • 拆出来的最小值要尽可能地大,这样前面的数拆分也不会太小。其实就是让拆出来的每一份更加均匀,拆出来的最小值 = ⌊ n u m s [ i ] k ⌋ \lfloor \frac{nums[i]}{k} \rfloor knums[i]
    class Solution:
        def minimumReplacement(self, nums: List[int]) -> int:
            ans = 0
            minValue = nums[-1] # 最后一个不用拆
    
            for x in nums[-2::-1]: # 从倒数第二个开始遍历
                if x > minValue:
                    k = ceil(x / minValue) # 上取整
                    ans += k - 1
                    minValue = x // k
                else:
                    minValue = x
            
            return ans
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • 相关阅读:
    Linux扩展篇之Shell编程二(运算符和条件判断)
    Java 线程的几种状态
    【TypeScript】深入学习TypeScript模块
    DynamicProgramming 动态规划
    【每日十分钟前端】基础篇19,普通函数、箭头函数、构造函数的区别
    【图像评价指标以及代码】 PSNR, SSIM, FID,NMSE讲解以及代码
    布隆过滤器
    数据库变更管理:Liquibase or Flyway
    隐语容器部署指南
    毕设 JAVA JSP 简单的OICQ聊天程序论文
  • 原文地址:https://blog.csdn.net/qq_39906884/article/details/126207069