class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
int total = 0;
int len1 = g.size();
int len2 = s.size();
int len = max(len1, len2);
sort(g.begin(), g.end());
sort(s.begin(), s.end());
int cur1 = 0;
int cur2 = 0;
while (cur1 < len1 && cur2 < len2) {
if (s[cur2] >= g[cur1]) {
total++;
cur1++;
cur2++;
} else {
cur2++;
}
}
return total; // 返回结果
}
};
挺简单的
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
if (nums.size() <= 1) return nums.size(); // 如果数组长度小于等于1,直接返回数组长度,因为无法形成摆动序列
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++; // 峰值个数加1
preDiff = curDiff; // 更新前一对差值为当前差值,注意这里,只在出现摆动变化的时候更新
}
}
return result; // 返回最大摆动子序列的长度
}
};
理解困难的地方:
在计算摆动序列的长度时,只要序列中的峰值数量是正确的,添加一个额外的峰值不会改变结果的原因在于摆动序列的长度只与峰值的数量有关,而不依赖于具体的峰值位置。
考虑一个摆动序列,每个峰值之间必然存在一个谷值(或相反)。因此,峰值的数量决定了摆动序列的长度。无论我们在序列中的哪个位置添加一个额外的峰值,只要最终计算的峰值数量是正确的,摆动序列的长度就不会改变。
假设原始序列中有n个峰值,根据定义,摆动序列的长度为n+1。如果我们在序列中添加了一个额外的峰值,导致峰值的数量增加为n+1个,那么最终计算得到的摆动序列的长度仍然是n+2,即便这个额外的峰值实际上并不是序列的真实峰值。因为摆动序列的长度只与峰值的数量相关,而与具体的峰值位置无关。
因此,即使在序列的末尾添加了一个假设的峰值,只要峰值的数量计算正确,最终的摆动序列的长度也会是正确的。
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int result = INT32_MIN;
int count = 0;
for (int i = 0; i < nums.size(); i++) {
count += nums[i];
if (count > result) { // 取区间累计的最大值(相当于不断确定最大子序终止位置)
result = count;
}
if (count <= 0) count = 0; // 相当于重置最大子序起始位置,因为遇到负数一定是拉低总和
}
return result;
}
};