代码随想录算法训练营第三十一天 | 455.分发饼干 376.摆动序列 53.最大子数组和
455.分发饼干
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(), g.end());
sort(s.begin(), s.end());
int index = 0;
// 从最小的饼干开始遍历
for(int i = 0; i < s.size(); ++i) {
// 尽量选取胃口小的小朋友,如果满足那么进行到下一个小朋友(++index)
if(index < g.size() && g[index] <= s[i]) {
++index;
}
// 如果不满,选取下一块更大的饼干
}
return index;
}
};
376.摆动序列
思路:
如果nums.size() == 1; 则返回1
找到第一组差值不为0的元素,如果全部差值均为0,返回1
否则初始化length和maxLength为2(因为已经有一组差值不为0的元素,所以初始化为2)
如果当前差值和前一个差值相乘为负数则length++更新maxLength
否则跳过,继续循环;
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
if(nums.size() == 1) return 1;
// 记录前一个差值
int pre;
// 记录第一个插值不为0的起始位置
int startIndex = 1;
// 从第一个插值不为零的地方开始
for(; startIndex < nums.size(); ++startIndex) {
if(pre = nums[startIndex] - nums[startIndex - 1]) break;
}
// 如果插值全部为零,则返回1
if(startIndex == nums.size()) return 1;
int length = 2;
int maxLength = 2;
for(int i = startIndex; i < nums.size(); ++i) {
int temp = nums[i] - nums[i - 1];
// 前一个差值和后一个差值相乘为负数则说明是摆动序列
if(temp * pre < 0) {
length++;
if(length > maxLength) maxLength = length;
pre = temp;
}
// 如果不是摆动的则直接跳过
}
return maxLength;
}
};
53.最大子数组和
思路:如果连续和为负数的话,直接从下一个数开始,因为此时 连续和 + 当前值 < 当前值;所以将连续和置为当前值,继续累加
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int maxSum = INT_MIN;
// 记录连续和
int sum = 0;
for(int i = 0; i < nums.size(); ++i) {
// 如果连续和小于0则,重新开始记录
if(sum < 0) sum = 0;
sum += nums[i];
maxSum = max(sum, maxSum);
}
return maxSum;
}
};