算法-贪心算法

本文探讨了贪心算法在解决Jump Game系列、Meeting Room问题以及Regular Expression匹配等调度和匹配问题中的应用。通过实例解析了贪心策略如何帮助解决0-1背包问题、霍夫曼编码等经典问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

贪心算法

  • 调度问题:Jump Game I、Jump Game II
  • 霍夫曼编码
  • 0-1背包问题

Jump Game

Jump Game I
bool canJump(vector<int>& nums) {
    if(nums.empty()) return true;
    int farthest=nums[0];
    for(int i=1;i<nums.size();i++){
        if(i<=farthest && (i+nums[i])>=farthest)
        farthest=i+nums[i];
    }
    return farthest>=nums.size()-1;
}
Jump Game II
int jump(vector<int>& nums){
    if(nums.size()<=1) return 0;
    int jump=1;
    int cur=nums[0];
    int maxS=nums[0];
    for(int i=1;i<nums.size();i++){
        cur=max(i+nums[i],cur);
        if(i==nums.size()-1) return jump;
        if(i==maxS){
           jump++;
           maxS=cur;   
        }
    }
}

Meeting Room

Meeting Room I
bool canAttendMeetings(vector<Interval>& intervals) {
    vector<pair<int, int> > changes;
    for(auto i:intervals){
        changes.push_back({i.start, 1});
        changes.push_back({i.end, -1});
    }
    sort(changes.begin(),changes.end());
    int times=0;int now=0;
    for(auto i: changes){
        times=max(times,now+=i.second);
        if(times>1) return false;
    }
    return true;
}
Meeting Room II
int minMeetingRooms(vector<Interval>& intervals) {
    vector<pair<int, int> >changes;
    for(auto inter: intervals){
        changes.push_back({inter.start,1});
        changes.push_back({inter.end, -1});
    }
    sort(changes.begin(),changes.end());
    int room=0,maxroom=0;
    for(auto i:changes)
        maxroom=max(maxroom,room+=i.second);   
    return maxroom;
}

Regular Expression

Regular Expression Matching
bool isMatch(string s, string p) {
        int m=s.length(), n=p.length(); 
        vector<vector<bool> > dp(m+1, vector<bool>(n+1, false));
        dp[0][0]=true;
        for (int i=0; i<=m; i++)
            for (int j=1; j<=n; j++)
                if (p[j-1] == '*') dp[i][j] = dp[i][j-2] || (i>0 && (s[i-1]==p[j-2]||p[j-2]=='.') && dp[i-1][j]);
                else               dp[i][j] = i>0 && dp[i-1][j-1] && (s[i-1]==p[j-1]||p[j-1]=='.');
        return dp[m][n];
    }
Wildcard Matching
bool isMatch(string s, string p) {
    int m=s.length();
    int n=p.length();
    int i=0,j=0,asterick=-1,match=0;
    while(i<m){
        if(j<n && p[j]=='*'){
            match = i;  
            asterick=j++;
        }
        else if(j<n && (s[i]==p[j] || p[j]=='?')){
            i++;
            j++;
        }
        else if(asterick>=0){
            i=++match;
            j=asterick+1;
        }
        else return false;
    }
    while(j<m && p[j]=='*') j++;
    return j==n;
}

Gas Station

    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int start = 0,tank = 0;
        int sumGas=accumulate(gas.begin(),gas.end(),sumGas);
        int sumCost=accumulate(cost.begin(),cost.end(),sumCost);
        for (int i=0; i< gas.size(); i++) {
            tank+=gas[i]-cost[i];
            if (tank<0) {
                start=i+1;
                tank=0;
            }
        }
        return sumGas<sumCost ? -1: start;
    }

Candy

    int candy(vector<int>& ratings) {
        int len = ratings.size(), res = 0, i;
        if(len>0){
            vector<int> number(len,1); 

            for(i=1; i<len;++i) 
                if(ratings[i]>ratings[i-1])
                    number[i] = number[i-1]+1;
            res = number[len-1];
            for(i=len-2; i>=0;--i){
                if(ratings[i]>ratings[i+1]) 
                    number[i] = max(number[i+1]+1,number[i]);
                res+=number[i];
            }
        }
        return res;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值