贪心算法专题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;
    }
相关推荐
大明者省9 小时前
WSL2 Ubuntu22.04 GPU训练环境配置指南
人工智能·算法·计算机视觉
白狐_79810 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander25811 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
Shell运维手记11 小时前
Linux 常用基础命令学习笔记
linux·运维·笔记·学习·算法·github
杨航 AI11 小时前
O(n log n):线性对数原理拆解 这个是排序算法的黄金复杂度之一。
算法·排序算法
船厂电气自动化ai大模型12 小时前
AI大模型与数学 第32课 函数凹凸性与二阶导数:拐点求解、凹凸区间计算(10道二阶导数计算题)
数据结构·人工智能·python·深度学习·算法
旖旎夜光12 小时前
LeetCode 3:无重复字符的最长子串(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
叠层归一研究院13 小时前
AGI 系统(十一):二阶网络 — 二阶递归 × 多主体 (元符号网络)
开发语言·人工智能·算法·php·agi
zlinear数据采集卡14 小时前
D223的PWM电机控制:6路独立脉冲+加减速算法深度解析
arm开发·stm32·嵌入式硬件·算法·fpga开发·架构
杨石兴14 小时前
31、玩具MoM:用2x2矩阵串起全套流程
人工智能·算法·矩阵·电磁学