122.买卖股票的最佳时机II - 力扣(LeetCode)
思路:只用将相邻的差值为正的存储起来,然后求和
代码:
class Solution {
public:
int maxProfit(vector<int>& prices) {
vector<int> res;
int sum = 0;
for(int i = 1;i < prices.size();i++)
{
int cur = prices[i] - prices[i-1];
if(cur > 0) res.push_back(cur);
}
for(int i = 0;i < res.size();i++) sum += res[i];
return sum;
}
};
思路:每次维护能到达的最远距离,如果最远距离包含了数组的最后一个下标就返回true,注意i每次只能在far的范围内移动,因为far是i能到达的最远距离
代码:
class Solution {
public:
bool canJump(vector<int>& nums) {
int far = 0;//表示能到达的最远距离
if(nums.size() == 1) return true;
for(int i = 0;i <= far;i++)
{
far = max(far,nums[i] + i);
if(far >= nums.size() - 1) return true;
}
return false;
}
};
思路:与前一个不同的是需要统计最小跳跃次数,考虑当i到达当前能跳到的最大距离后,跳跃次数+1,然后从far的地方重新开始跳
代码:
class Solution {
public:
int jump(vector<int>& nums) {
int minstep = 0;
int far = 0;
int curdis = 0;
if(nums.size() == 1) return 0;
for(int i = 0;i < nums.size() - 1;i++)
{
far = max(far,nums[i] + i);//更新下一步到达的最远下标
if(i == curdis)//遇到当前覆盖的最远距离下标
{
curdis = far;//更新当前覆盖的最远距离下标,即下一步从far开始跳
minstep++;
}
}
return minstep;
}
};
1005.K次取反后最大化的数组和 - 力扣(LeetCode)
思路:排序后将最小的数进行翻转,然后再次排序,得到的就是最大数组和
代码:
class Solution {
public:
int largestSumAfterKNegations(vector<int>& nums, int k) {
int sum = 0;
while(k--)
{
sort(nums.begin(),nums.end());
nums[0] = -nums[0];
}
for(int i = 0;i < nums.size();i++) sum += nums[i];
return sum;
}
};