455. 分发饼干
代码
方法一:
class Solution { //455. 分发饼干 遍历孩子 小胃口得到小饼干
public:
int findContentChildren(vector<int>& g, vector<int>& s) {
int result = 0;
sort(g.begin(), g.end());
sort(s.begin(), s.end());
int j = 0;
for (int i = 0; i < g.size(); ++i) {
while (j < s.size() && g[i] > s[j]) {
j++;
}
if (j >= s.size()) break;
result++;
j++;
}
return result;
}
};
方法二:
class Solution { //455. 分发饼干 遍历饼干 小饼干先喂饱小胃口
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) {
if (index < g.size() && g[index] <= s[i])
index++;
}
return index;
}
};
int main() {
vector<int> g = { 1, 2, 3 };
vector<int> s = { 3 };
Solution s1;
int result = s1.findContentChildren(g, s);
printf("%d\n", result);
return 0;
}
376. 摆动序列
代码
class Solution { //376. 摆动序列 计算峰值的个数
public:
int wiggleMaxLength(vector<int>& nums) {
if (nums.size() <= 1)return nums.size();
int result = 1;
int curDiff = 0;
int preDiff = 0;
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;
}
}
return result;
}
};
53. 最大子数组和
代码
class Solution { //53. 最大子数组和 累加和 一旦累加和小于0,就重新开始计算
public:
int maxSubArray(vector<int>& nums) {
int result = INT_MIN;
int count = 0;
for (int i = 0; i < nums.size(); ++i) {
count += nums[i];
if (result < count) {
result = count;
}
if (count <= 0) count = 0;
}
return result;
}
};
122. 买卖股票的最佳时机 II
代码
class Solution { //122. 买卖股票的最佳时机 II 画一个折线图,只计算上升部分的值
public:
int maxProfit(vector<int>& prices) {
int result = 0;
for (int i = 1; i < prices.size(); ++i) {
result += max(prices[i] - prices[i - 1], 0);
}
return result;
}
};
int main() {
vector<int> prices = { 7, 6, 4, 3, 1 };
Solution s;
int result = s.maxProfit(prices);
printf("%d\n", result);
return 0;
}
55. 跳跃游戏
代码
class Solution { //55. 跳跃游戏 每次取最大跳跃步数(最大跳跃范围),然后每次移动一步,更新最大跳跃范围,看最后能否覆盖终点
public:
bool canJump(vector<int>& nums) {
int range = nums[0];
if (range == 0 && nums.size() > 1) return false;
for (int i = 1; i < nums.size(); ++i) {
if (i + nums[i] > range) {
range = i + nums[i];
}
if (i != nums.size()-1 && range <= i)return false;
}
return true;
}
};
int main() {
vector<int> nums = { 3, 2, 1, 0, 4 };
Solution s;
bool result = s.canJump(nums);
cout << result << endl;
return 0;
}
45. 跳跃游戏 II
代码
class Solution { //45. 跳跃游戏 II
public:
int jump(vector<int>& nums) { //移动下标,到达当前最远距离下标时,还没到终点,步数就加1,来增加覆盖距离
if (nums.size() == 1)return 0;
int curDistance = 0;
int ans = 0;
int nextDistance = 0;
for (int i = 0; i < nums.size(); ++i) {
nextDistance = max(i + nums[i], nextDistance);
if (i == curDistance) {
if (curDistance != nums.size() - 1) {
ans++;
curDistance = nextDistance;
if (nextDistance >= nums.size() - 1) break;
}
else break;
}
}
return ans;
}
};
1005. K 次取反后最大化的数组和
代码
class Solution { //1005. K 次取反后最大化的数组和
//首先对数组排序,j从下标0开始,循环k次,如果nums[j]为负数,变为正数,j++;
//如果nums[j]=0,剩余次数全都给0,跳出;
//如果nums[j]>0,将数组重新排序,选择最小的值,也就是第一个值,将剩余次数全部给第一个值,跳出
//注意:如果数组全为负数,可能出出现将所有负数全部转为正数之后还有次数,此时让j变为0,从头开始继续将剩余次数选择完,其实就是将剩余次数全部给此时数组中的最小值
public:
int largestSumAfterKNegations(vector<int>& nums, int k) {
int sum = 0;
sort(nums.begin(), nums.end());
int j = 0;
for (int i = 0; i < k; i++) {
if (j >= nums.size())j = 0;
if (nums[j] < 0) {
nums[j] = -nums[j];
j++;
}
else if (nums[j] == 0) break;
else if (nums[j] > 0){
sort(nums.begin(), nums.end());
j = 0;
if ((k - i) % 2 != 0) {
nums[j] = -nums[j];
}
break;
}
}
for (int i = 0; i < nums.size(); i++) {
sum += nums[i];
}
return sum;
}
};
int main() {
vector<int> nums = { -4,-2,-3 };
int k = 4;
Solution s;
int result = s.largestSumAfterKNegations(nums, k);
cout << result << endl;
return 0;
}