代码随想录:贪心_01

455. 分发饼干

从最小开始

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        int cnt = 0;
        sort(g.begin(),g.end());
        sort(s.begin(),s.end());
        for(int i=0,j=0;i<g.size() && j<s.size();j++){
            if(s[j] >= g[i]){
                cnt++;
                i++;
            }
        }
        return cnt;
    }
};

从最大开始

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        int cnt = 0;
        sort(g.rbegin(),g.rend());
        sort(s.rbegin(),s.rend());
        for(int i=0,j=0;i<g.size() && j<s.size();i++){
            if(s[j] >= g[i]){
                cnt++;
                j++;
            }
        }
        return cnt;
    }
};

376. 摆动序列

贪心解法

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        if (nums.size() <= 1) return nums.size();
        int curDiff = 0; // 当前一对差值
        int preDiff = 0; // 前一对差值
        int result = 1;  // 记录峰值个数,序列默认序列最右边有一个峰值
        for (int i = 0; i < nums.size() - 1; i++) {
            curDiff = nums[i + 1] - nums[i];
            // 出现峰值
            if ((preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0)) {
                result++;
                preDiff = curDiff; // 注意这里,只在摆动变化的时候更新prediff
            }
        }
        return result;
    }
};

普通解法

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

53. 最大子数组和

贪心解法

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        if(nums.size() == 0)
            return 0;
        int max = INT_MIN;
        int sum = 0;
        for(int i = 0;i < nums.size();i++){
            sum += nums[i];
            if(sum > max){
                max = sum;
            }
            if(sum < 0){
                sum = 0;
            }
        }
        return max;
    }
};

122. 买卖股票的最佳时机 II

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

55. 跳跃游戏

回溯超时

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

贪心

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

45. 跳跃游戏 II

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

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

class Solution {
public:
    int largestSumAfterKNegations(vector<int>& nums, int k) {
        sort(nums.begin(),nums.end());
        int sum = 0;
        for(int i = 0;i < nums.size() && k > 0;i++){
            if(nums[i] < 0){
                nums[i] = -nums[i];
                k--;
            }
        }
        for(int i=0;i<nums.size();i++){
            sum += nums[i];
        }
        sort(nums.begin(),nums.end());
        if(k % 2){
            sum -= nums[0]*2;
        }
        return sum;
    }
};

134. 加油站

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int n = gas.size();
        int curgas = 0, totalgas = 0;
        int start = 0;
        for(int i = 0; i < n; i++){
            curgas += gas[i] - cost[i];
            totalgas += gas[i] - cost[i];
            if(curgas < 0){
                start = i + 1;
                curgas = 0;
            }
        }
        if(totalgas < 0)
            return -1;
        return start;
    }
};

135. 分发糖果

class Solution {
public:
    int candy(vector<int>& ratings) {
        vector<int> candy(ratings.size(),1);
        for(int i = 1;i < ratings.size();i++){
            if(ratings[i-1] < ratings[i]){
                candy[i] = candy[i-1] + 1;
            }
        }
        for(int i = ratings.size() - 1;i > 0;i--){
            if(ratings[i-1] > ratings[i]){
                candy[i-1] = max(candy[i] + 1,candy[i-1]);
            }
        }
        int sum = 0;
        for(int i = 0;i < candy.size();i++){
            sum += candy[i];
        }
        return sum;
    }
};

406. 根据身高重建队列

直接在原有数组中调整

class Solution {
public:
    static bool cmp(vector<int> p1,vector<int> p2){
        if(p1[0] == p2[0])
            return p1[1] < p2[1];
        return p1[0] > p2[0];
    }
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        sort(people.begin(),people.end(),cmp);
        for(int i = 0; i < people.size(); i++){
            int pos = people[i][1];
            if(pos < i){
                vector<int> vec = people[i];
                for(int j = i-1; j >= pos; j--){
                    people[j+1] = people[j];
                }
                people[pos] = vec;
            }
        }
        return people;
    }
};

新数组

class Solution {
public:
    static bool cmp(const vector<int>& a, const vector<int>& b) {
        if (a[0] == b[0]) return a[1] < b[1];
        return a[0] > b[0];
    }
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        sort (people.begin(), people.end(), cmp);
        vector<vector<int>> que;
        for (int i = 0; i < people.size(); i++) {
            int position = people[i][1];
            que.insert(que.begin() + position, people[i]);
        }
        return que;
    }
};

优化

class Solution {
public:
    // 身高从大到小排(身高相同k小的站前面)
    static bool cmp(const vector<int>& a, const vector<int>& b) {
        if (a[0] == b[0]) return a[1] < b[1];
        return a[0] > b[0];
    }
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        sort (people.begin(), people.end(), cmp);
        list<vector<int>> que; // list底层是链表实现,插入效率比vector高的多
        for (int i = 0; i < people.size(); i++) {
            int position = people[i][1]; // 插入到下标为position的位置
            std::list<vector<int>>::iterator it = que.begin();
            while (position--) { // 寻找在插入位置
                it++;
            }
            que.insert(it, people[i]);
        }
        return vector<vector<int>>(que.begin(), que.end());
    }
};
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值