[算法训练营] 贪心算法专题(二)

简介: [算法训练营] 贪心算法专题(二)

前言

本篇为贪心算法专题,总共5道题目,记录我的解题思路和一些感悟,供大家参考~

376. 摆动序列

链接:376. 摆动序列

解题思路

  • 主要的思路是处理平坡,也就是都是一样的值的情况
  1. 怎么找到峰值?左边比当前节点小,右边比当前节点小,或者反过来
  2. 如果只有两个值怎么办呢?我们需要为他先创建一个值放在左边,它和第一个值相同即可,这样就不会影响结果。
  3. 平坡是峰值:也就是说峰值是连续一样的值,此时只能记录一个峰值

@代码随想录

AC代码

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        if(nums.size()<=1)return nums.size();
        int curGap=0;//后一个节点和当前节点的差值
        int preGap=0;//当前节点和前一个节点的差值
        int result=1;
        for(int i=0;i<nums.size()-1;++i){
            curGap = nums[i+1] - nums[i];
            if((preGap>=0&&curGap<0)||(preGap<=0&&curGap>0)){//判断峰值的条件 
                result++;
                preGap = curGap;//只在波动的时候更新前一个差值
            }
        }
        return result;
    }
};

53. 最大子数组和

链接:53. 最大子数组和

解题思路

下面是四种实现方法,这次只讲贪心怎么实现

  1. 题目要求是最长子数组和,所以就要连续还要找最大的
  2. 我们可以这样,先用最小整数作为结果的初始值
  3. 然后,用另一个值count来加
  4. 如果比res大,就更新res
  5. 当这个值为负数时说明这个情况可以舍弃了,从+1的位置继续,同时更新count

AC代码

class Solution {
public:
    //贪心
    int maxSubArray(vector<int>& nums) {
        int res=INT_MIN;
        int count=0;
        for(int i=0;i<nums.size();++i){
            count+=nums[i];
            if(count>res)res=count;
            if(count<=0)count=0;
        }
        return res;
    }
    //滑动窗口
    // int maxSubArray(vector<int>& nums) {
    //     int left = 0, right = 0;
    //     int windowSum = 0, maxSum = INT_MIN;
    //     while(right < nums.size()){
    //         // 扩大窗口并更新窗口内的元素和
    //         windowSum += nums[right];
    //         right++;
    //         // 更新答案
    //         maxSum = windowSum > maxSum ? windowSum : maxSum;
    //         // 判断窗口是否要收缩
    //         while(windowSum < 0) {
    //             // 缩小窗口并更新窗口内的元素和
    //             windowSum -=  nums[left];
    //             left++;
    //         }
    //     }
    //     return maxSum;
    // }
    //动态规划
    // int maxSubArray(vector<int>& nums)
    // {
    //     int n=nums.size();
    //     if(n==0)return 0;
    //     vector<int> dp(n);
    //     dp[0]=nums[0];
    //     for(int i=1;i<n;++i)
    //     {
    //         dp[i]=max(nums[i],nums[i]+dp[i-1]);
    //     }
    //     int ret=INT_MIN;
    //     for(int j=0;j<n;++j)
    //     {
    //         ret=max(ret,dp[j]);
    //     }
    //     return ret;
    // }
    // int maxSubArray(vector<int>& nums)
    // {
    //     int n=nums.size();
    //     if(n==0)return 0;
    //     int dp_0=nums[0];
    //     int dp_1=0,ret=dp_0;
    //     for(int i=1;i<n;++i)
    //     {
    //         dp_1=max(nums[i],nums[i]+dp_0);
    //         dp_0=dp_1;
    //         ret=max(ret,dp_1);
    //     }
    //     return ret;
    // }
    //前缀和
    // int maxSubArray(vector<int>& nums)
    // {
    //     int n=nums.size();
    //     vector <int> presum(n+1);
    //     presum[0]=0;
    //     for(int i=1;i<=n;++i)
    //     {
    //         presum[i]=presum[i-1]+nums[i-1];
    //     }
    //     int minval=INT_MAX;
    //     int ret=INT_MIN;
    //     for(int j=0;j<n;++j)
    //     {   
    //         minval=min(minval,presum[j]);
    //         ret=max(ret,presum[j+1]-minval);
    //     }
    //     return ret;
    // }
};

55. 跳跃游戏

链接:55. 跳跃游戏

解题思路

  • 题目的意思是 从当前位置能否到达最后一个位置 可以超过 但是不能小于
  • 所以可以理解为是在一个位置上它的覆盖范围包含了最后一个位置就算是true
  • 所以只要不断更新新位置范围 到最后找到是否大于最后一个位置的坐标即可

AC代码

class Solution {
public:
    bool canJump(vector<int>& nums) {
        if(nums.size() == 1) return true;
        int cover = 0;
        for(int i = 0;i <= cover;++i){
            cover = max(cover,i+nums[i]);
            if(cover >= nums.size()-1)return true;
        }
        return false;
    }
};

45 跳跃游戏2

链接:45 跳跃游戏2

解题思路

  • 和前面的"跳跃游戏"一样 它也要覆盖最后一个点 不同在于本题要求的是次数 也就是要第几次跳跃才能覆盖最后一个点
  • 当移动下标移动到覆盖范围的最大值还没有覆盖到最后一个点 此时的jmp就要+1
  • 值得注意的是题目说了 生成的测试用例可以到达 nums[n - 1] 就不用考虑其他情况了

AC代码

class Solution {
public:
    int jump(vector<int>& nums) {
        if(nums.size()==1)return 0;
        int curmax=0,nextmax=0,jum=0;;
        for(int i=0;i<nums.size();++i){
            nextmax = max(nextmax,nums[i]+i);
            if(i==curmax){
                curmax = nextmax;
                jum++;
                if(curmax >= nums.size()-1)break;
            }
        } 
        return jum;
    }
};

134. 加油站

链接:134. 加油站

解题思路

参考代码随想录

我的感觉:

  • 贪心的题目没有一种具体的模板,有的只是一种类似技巧性的思想,一般都不会这么想,可能是我写贪心写的太少了,”局部最优推出全局最优“这种思路还不够清晰,继续加油吧

AC代码

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {  
        int curSum=0;
        int totalSum=0;
        int start=0;
        for(int i=0;i<gas.size();++i){ 
            curSum += gas[i] - cost[i];
            totalSum += gas[i] - cost[i];
            if(curSum < 0){//当前累加rest[i]和curSum一旦小于0
                start = i + 1; //起始位置更新为i+1
                curSum = 0;//curSum从0开始
            }
        }
        if(totalSum < 0)return -1;//说明怎么走都不可能跑一圈了
        return start;
    }
};


相关文章
|
13天前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
30 2
|
1月前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
蓝桥杯Python编程练习题的集合,涵盖了从基础到提高的多个算法题目及其解答。
60 3
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
|
21天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
1月前
|
机器学习/深度学习 算法 决策智能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
|
1月前
|
算法 Java C++
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
【贪心算法】算法训练 ALGO-1003 礼物(C/C++)
|
1月前
|
算法 C++
蓝桥 算法训练 共线(C++)
蓝桥 算法训练 共线(C++)
|
2月前
|
算法 前端开发
一文了解贪心算法和回溯算法在前端中的应用
该文章深入讲解了贪心算法与回溯算法的原理及其在前端开发中的具体应用,并通过分析LeetCode题目来展示这两种算法的解题思路与实现方法。
|
4月前
knn增强数据训练
【7月更文挑战第28天】
41 2
|
3月前
|
算法 搜索推荐
支付宝商业化广告算法问题之基于pretrain—>finetune范式的知识迁移中,finetune阶段全参数训练与部分参数训练的效果如何比较
支付宝商业化广告算法问题之基于pretrain—>finetune范式的知识迁移中,finetune阶段全参数训练与部分参数训练的效果如何比较
|
3月前
|
算法
【算法】贪心算法——柠檬水找零
【算法】贪心算法——柠檬水找零
下一篇
无影云桌面