算法训练1-day23-贪心

29 阅读1分钟
  1. 455. 分发饼干

小胃口用小饼干,那就是先遍历饼干;如果反过来,大胃口用大饼干,那么就要先遍历胃口,因为我们排好序后,如果当前胃口对应的当前大饼干都不能满足,那么剩下的所有饼干就都不能满足,如果遍历的是饼干,就会出现一个大胃口将所有饼干都判为不合适的情况 AC代码:

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

AC代码:

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        int ans = 1;
        int prevdiff = 0;
        int currdiff = 0;
        for (int i = 0; i < nums.size() - 1; i++) {
            currdiff = nums[i + 1] - nums[i];
            if ((prevdiff <= 0 && currdiff > 0) ||
                (prevdiff >= 0 && currdiff < 0)) {
                ans++;
                prevdiff = currdiff;
            }
        }
        return ans;
    }
};
  1. 53. 最大子数组和

注意保存最大值的变量初始化的数值,还有题目所给的nums中的值的范围是否包含负数,如果有负数,那maxSum就应该初始化为一个尽可能小的数

代码如下:

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

        return maxSum;
    }
};