买卖股票的最佳时机Ⅱ
题目链接:122. 买卖股票的最佳时机 II - 力扣(LeetCode)
总体思路:
计算每一天的利润,只要利润大于0的天数,获取的利润和就是总的最大利润。
注意:利润的数组要比股票价格数组少一位,因为第一天必定没有利润。
总体代码:
class Solution {
public:
int maxProfit(vector<int>& prices) {
//通过利润,只要是正利润就加
int sum =0;
for(int i=1;i<prices.size();i++)
{
if(prices[i]-prices[i-1]>0)
{
sum += prices[i]-prices[i-1];
}
}
return sum;
}
};
跳跃游戏
总体思路:
整体上就是去求当前坐标与之前的坐标,最远能够覆盖的地方
总体代码:
class Solution {
public:
bool canJump(vector<int>& nums) {
int fugai =0;//定义一个覆盖下标位置
for(int i=0;i<nums.size();i++)
{
if(fugai<i)break;
fugai = fugai<i+nums[i]?i+nums[i]:fugai;//更新覆盖的值
//如果当前的覆盖值小于当前的值,就退出
}
//判断
return fugai>=nums.size()-1;
}
};
跳跃游戏Ⅱ
题目链接:45. 跳跃游戏 II - 力扣(LeetCode)
总体思路:
同样,通过当前的覆盖范围,然后去遍历覆盖的值,获得最大的下一次覆盖位置。当走到当前覆盖的值的最后位置,要进行下一次跳跃,步数+1,更新当前的覆盖范围。
总体代码:
class Solution {
public:
int jump(vector<int>& nums) {
//记录最短的次数
int cishu = 0;
//记录当前可以到达的位置
int cur_weizhi = 0;
//记录在遍历当前位置的时候,下一次最远可以跳到多少
int next_weizhi =0;
for(int i=0;i<nums.size();i++)
{
//进行判断:当前的位置是不是已经包含了末尾
if(cur_weizhi>=nums.size()-1)break;
//判断当前是不是已经到达了当前能到达的最远位置
//在遍历当前位置的时候,需要记录下一次最远的位置
next_weizhi = next_weizhi>i+nums[i]?next_weizhi:i+nums[i];
if(i==cur_weizhi)
{
//替换掉当前的位置为下一次的位置,同时进行次数+1
cishu +=1;
cur_weizhi = next_weizhi;
}
}
return cishu ;
}
};
K次取反后最大化的数组和
题目链接:1005. K 次取反后最大化的数组和 - 力扣(LeetCode)
总体思路:
(1)有正负,所以先将绝对值大的负数转换成整数使得和变得更大
(2)如果k还有多余的,就需要将其转换绝对值最小的数,达到影响最小
总体代码:
class Solution {
public:
int largestSumAfterKNegations(vector<int>& nums, int k) {
sort(nums.begin(),nums.end());//从小到达排序
for(int i=0;k>0;k--)//先处理小于0的元素.从最小的开始,最多循环k次
{
//需要判断当前是不是已经超过了nums数组
if(i>=nums.size())break;
if(nums[i]<0)
{
nums[i]= -nums[i];
i++;
}
else //最小的值都大于等于0,可以直接退出了
{
break;
}
}
//此时不知道k循环完没有,如果没有需要对最小值进行处理,如果循环完了直接输出和
sort(nums.begin(),nums.end());
while(k--)
{
nums[0] = -nums[0];
}
int sum =0;
for(int i=0;i<nums.size();i++)
{
sum += nums[i];
}
return sum;
}
};