Leetcode-贪心算法

贪心算法

贪心算法的核心就是先达到局部最优,最后结合起来一步一步达到全局最优。

题目

分配题目

题目1:有一群孩子和一堆饼干,每个孩子有一个饥饿度,每个饼干都有一个大小。每个孩子只能吃最多一个饼干,且只有饼干的大小大于孩子的饥饿度时,这个孩子才能吃饱。求解最多有多少孩子可以吃饱?

int assign_cookie(vector<int> childen, vector<int> cookie){
    //先满足饥饿度小的孩子,这样就能让吃饱的孩子更多。
    sort(childen.begin(), childen.end());
    sort(cookie.begin(), cookie.end());
    int count = 0;
    int i=0, j=0;
    while(i<childen.size() && j<cookie.size()){
        if(childen[i] < cookie[j]){
            count++;
            i++;
            j++;
        }
        else{
            j++;
        }
    }
    return count;
}

int main() {
    vector<int> child = {2,4};
    vector<int> cookie = {1,2,3};
    int result = 0;
    result = assign_cookie(child,cookie);
    cout << result << endl;
    return 0;
}

题目2:一群孩子站成一排,每一个孩子有自己的评分。现在需要给这些孩子发糖果,规则是如果一个孩子的评分比自己身旁的一个孩子要高,那么这个孩子就必须得到比身旁孩子更多的糖果;所有孩子至少要有一个糖果。求解最少需要多少个糖果?

#include <iostream>
#include <string>
#include <vector>
#include <numeric>
using namespace std;

int assign_candy(vector<int> scores){
    if(scores.size()==0){
        return 0;
    }
    else if(scores.size()==1){
        return 1;
    }
    else if(scores.size()==2){
        if(scores[0]==scores[1]){
            return 2;
        }
        else{
            return 3;
        }
    }
    int len = scores.size();
    vector<int> arr(len, 1);
    //从左到右遍历,右>左
    for(int i=1; i<len; i++){
        if(scores[i-1]<scores[i]){
            arr[i] = arr[i-1]+1;
        }
    }
    //从右到左遍历,左>右
    for(int j=len-1; j>0; j--){
        if(scores[j-1]>scores[j]){
            arr[j-1] = arr[j]+1;
        }
    }
    int result = 0;
    result = accumulate(arr.begin(), arr.end(), 0);
//    for(int i=0; i<len; i++){
//        result += arr[i];
//    }
    return result;
}

int main() {
    vector<int> scores = {1,0,2};
    int result = 0;
    result = assign_candy(scores);
    cout << result << endl;
    return 0;
}
区间题目

题目1:给定多个区间,计算让这些区间互不重叠所需要移除区间的最少个数。起止相连不算重叠。

#include <iostream>
#include <string>
#include <vector>
#include <numeric>
using namespace std;

bool cmp(vector<int> a, vector<int> b){
    return a[1] < b[1];
}
//优先保留结尾小且不相交的区间。
int non_overlap(vector<vector<int>> arr){
    int len = arr.size();
    int result = 0;
    sort(arr.begin(), arr.end(), cmp);
    int End = arr[0][1];
    for(int i=1; i<len; i++){
        if(arr[i][0]<End){
            result++;
        }
        else{
            End = arr[i][1];
        }
    }
    return result;
}

int main() {
    vector<vector<int>> arr={{1,2},{2,4},{1,3}};
    int result = non_overlap(arr);
    cout << result << endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超超爱AI

土豪请把你的零钱给我点

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值