贪心算法2

117 阅读1分钟

小知识,大挑战!本文正在参与“   程序员必备小知识   ”创作活动

本文同时参与 「掘力星计划」   ,赢取创作大礼包,挑战创作激励金

5.引爆气球

问题:

解法: 和之前的去除重叠区间类似。要想引爆气球,需要每次的区间有重叠,首先引爆的是区间长度最小的那个,其余的区间和它有交集就可以跳过。不断重复。那么怎么去排序呢? !! 按照末尾值最小排序。

class Solution {
public:
    static bool compare(vector<int> &a,vector<int>&b)
    {
        if(a[1]<b[1]) return true;
        return false;
    }
    int findMinArrowShots(vector<vector<int>>& points) {
        sort(points.begin(),points.end(),compare);
        for(int i=0;i<points.size();i++)
        {
            cout<<points[i][0]<<points[i][1]<<endl;
        }
        int count=0;
        if(points.empty()) return count;
        int pre_start =points[0][0];
        int pre_end =points[0][1];
        count++;
        for(int i=1;i<points.size();i++)
        {
            if(points[i][0]>pre_end)
            {
                pre_start=points[i][0];
                pre_end =points[i][1];
                count++;
            }else{
                pre_start=points[i][0];
            }
        }
                for(int i=1;i<points.size();i++)
        {
            if(points[i][0]>pre_end)
            {
                pre_start=points[i][0];
                pre_end =points[i][1];
                count++;
            }else{
                pre_start=points[i][0];
            }
        }
        return count;

    }
};

6.划分字母空间

问题:

同一个字母最多出现在一个片段里。 解法:双指针+贪心算法。每次字段的长度必须要等于当前出现的字母最后出现的位置。因此先统计每个字母出现的最后位置。用2个指针表示开始和结束。当结束的位置满足所有字母都已经出现(字母出现的最后位置),成功。 复杂度是N的。因为返回的是所有的长度,所以必须也要有start指针。

class Solution {
public:
    vector<int> partitionLabels(string S) {
       unordered_map<char,int>count;
       vector<int>last(26,0);
       vector<int>result;
       for(int i=0;i<S.size();i++)
       {
           char c=S[i];
           last[c-'a']=i;
       }
       int start=0;
       int end=0;
       for(int i=0;i<S.size();i++)
    {
         char c=S[i];
         end  =max(end,last[c-'a']);
         if(end==i)
         {
             result.push_back(end-start+1);
             start=end+1;
         }

    }
    return result;



    }
};

7.买股票 问题:

解法:简单的股票题。尽可能多的交易。全局的profit表示当前利润,遍历一遍的时候如果满足交易情况,就直接的去算利润。不满足就设置当前最小值。

class Solution {
public:
    int maxProfit(vector<int>& prices) {
            int profit=0;
            if(prices.empty()||prices.size()==1) return 0;
            for(int i=1;i<prices.size();i++)
            {
                profit=profit+((prices[i]-prices[i-1])>0?(prices[i]-prices[i-1]):0);
                cout<<profit<<endl;
            }
            return profit;
    }
};