贪心算法专题Day19

122. 买卖股票的最佳时机 II

总收益可拆解为相邻单日正收益之和,局部最优(赚单日差价)能直接推导出全局最优

cpp 复制代码
    int maxProfit(vector<int>& prices) {
        int res = 0;
        for(int i = 1; i < prices.size(); i++){
            if(prices[i] - prices[i - 1] > 0){
                res += prices[i] - prices[i - 1];
            }
        }
        return res;
    }

55. 跳跃游戏

每一步的贪心选择:扩展最远边界

cpp 复制代码
bool canJump(vector<int>& nums) {
        int farest = 0;
        for(int i = 0; i < nums.size() && i <= farest; i++){
            farest = max(i + nums[i], farest);
            if(farest >= nums.size() - 1){
                return true;
            }
        }
        return false;
    }

45. 跳跃游戏 II

分层跳跃求最少次数

每次在最远边界之前 都记录 下次更新的值

到达边界后 跳一步 再更新边界,若边界未到达终点,则需要进入下一跳边界的寻找中

cpp 复制代码
    int jump(vector<int>& nums) {
        if(nums.size() == 1){
            return 0;
        }
        int farest = 0;
        int end = 0;
        int res = 0;
        for(int i = 0; i < nums.size() - 1; i++){
            farest = max(i + nums[i], farest);
            if(i == end){
                end = farest;
                res++;
            }
        }
        return res;
    }

1005. K 次取反后最大化的数组和

第一步:排序

第二步:尽可能将所有负数取反

第三步:若k没用完,此时nums中所有数都大于等于0,取负两次相当于没变化,于是用k%2,若还余1,把最小的数取反

第四步:求和

cpp 复制代码
    int largestSumAfterKNegations(vector<int>& nums, int k) {
        sort(nums.begin(), nums.end());
        //对所有负数取反
        for(int i = 0; i < nums.size() && k > 0; i++){
            if(nums[i] < 0){
                nums[i] = nums[i] * -1;
                k--;
            }
            else{
                break;
            }
        }
        //若k有剩余,对最小的数取反
        if(k > 0){
            if(k % 2 == 1){
                sort(nums.begin(), nums.end());
                nums[0] = nums[0] * -1;
            }
        }
        //求和
        int sum = 0;
        for (int num : nums) {
            sum += num;
        }
        return sum;
    }
相关推荐
不会就选b23 分钟前
算法日常・每日刷题--<贪心>15
算法
鹿角片ljp36 分钟前
Prompt Cache、Token 成本与 Plan Compiler 的工程设计
java·python·算法
萧西待水7 小时前
奥赛一本通 1447 靶形数独
算法·深度优先
泯泷9 小时前
那段文字是谁删的?Yjs 14 正式版之前,一套删除归属方案的实现与边界
前端·javascript·算法
hold?fish:palm9 小时前
34 合并K个升序链表
javascript·算法·链表
Navigator_Z11 小时前
LeetCode //C - 1252. Cells with Odd Values in a Matrix
c语言·算法·leetcode
语戚13 小时前
力扣 1621. 大小为K的不重叠线段的数目:动态规划(Java 实现)
java·算法·leetcode·动态规划·力扣·dp
青山木13 小时前
Hot 100 --- 最长有效括号
java·数据结构·算法·leetcode·动态规划
这料鬼有毒15 小时前
二刷hot100-1143.最长公共子序列
算法·leetcode·动态规划
政企项目老覃15 小时前
边缘 AI 推理部署:安防零售场景下的模型裁剪与端侧落地实践
人工智能·程序人生·算法·性能优化·vllm