455.分发饼干
直接用双指针法进行比较,如果饼干够小孩吃,那就判断下一个小孩够不够吃下一块饼干;如果不够,则判断同一个小孩够不够吃下一块饼干。
class Solution {
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
sort(g.begin(), g.end());
sort(s.begin(), s.end());
int sum = 0;
int i = 0, j = 0;
while(i < g.size() && j < s.size()) {
if(s[j] >= g[i]) {
j++;
i++;
sum++;
}else {
j++;
}
}
return sum;
}
};
376. 摆动序列
up和down代表下一个点和当前点之间的状态(如果序列增加,当前点处于山峰下一个点得是山谷,因此down为true,up为false),这样的好处是不用考虑平直的情况。
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
int sum = 1;
bool up = true;
bool down = true;
for(int i = 0; i < nums.size() - 1; ++i) {
if(nums[i] < nums[i+1] && up) {
up = false;
down = true;
sum++;
}
if(nums[i] > nums[i+1] && down) {
up = true;
down = false;
sum++;
}
}
return sum;
}
};
53. 最大子序和
用了前缀和的思路,子集就是前缀和数组任意两个元素相减。设立minVal记录i之前的最小值,然后比较最大值和当前指向元素减去minVal即可。
class Solution {
public:
int maxSubArray(vector<int>& nums) {
vector<int> vec(nums.size(), 0);
vec[0] = nums[0];
int maxVal = nums[0];
int minVal = 0;
for(int i = 1; i < nums.size(); ++i) {
vec[i] = vec[i-1] + nums[i];
}
for(int i = 0; i < vec.size(); ++i) {
maxVal = max(maxVal,vec[i] - minVal);
minVal = min(minVal, vec[i]);
}
return maxVal;
}
};