算法学习【贪心算法】(简单)


贪心算法一般分为如下四步:

  • 将问题分解为若干个子问题
  • 找出适合的贪心策略
  • 求解每一个子问题的最优解
  • 将局部最优解堆叠成全局最优解

跳跃游戏

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

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

class Solution &#123;
public:
    int largestSumAfterKNegations(vector<int>& nums, int k) &#123;
        
        int sum=0;
        for(int i=0;i<nums.size();i++)&#123;
            sum+=nums[i];
        &#125;
        for(int i=0;i<k;i++)&#123;
            int minv=INT32_MAX;
            for(int j=0;j<nums.size();j++)&#123;
                minv=min(nums[j],minv); 
                
            &#125;
            for(int j=0;j<nums.size();j++)&#123;
                if(minv==nums[j])&#123;
                    nums[j]=-1*nums[j];
                    sum+=nums[j]*2;
                    break;
                &#125;
            &#125;
            
        &#125;
        return sum;
    &#125;
&#125;;

加油站

class Solution &#123;
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) &#123;
        int oil = 0;
        int size = gas.size();
        int num=0;
        for(int i=0;i<size;i++)&#123;
            gas.push_back(gas[i]);
            cost.push_back(cost[i]);
        &#125;
        for(int i=0;i<size*2;i++)&#123;
            if(oil+gas[i]-cost[i]<0)&#123;
                oil=0;
                num=0;
                cout<<i<<endl;
            &#125;else&#123;
                oil=oil+gas[i]-cost[i];
                num++;
            &#125;
            if(num==size)&#123;
                return i-size+1;
            &#125;
        &#125;
        return -1;
    &#125;
&#125;;

文章作者: Turboost Chen
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Turboost Chen !
  目录