买卖股票的最佳时机 leetcode 122
股票价格数组中两两做差就是每条的利润,遍历数组只要利润大于0就累加到结果res。
class Solution {
public:
int maxProfit(vector<int>& prices) {
int res=0;
for(int i=0;i<prices.size()-1;i++){
res+=max(prices[i+1]-prices[i],0);
}
return res;
}
};
跳跃游戏 leetcode 55
在覆盖范围内遍历数组并更新最大覆盖范围,直到最大覆盖范围可以大于等于nums.size()-1。
局部最优就是每遍历一个元素就尽可能增加它的覆盖范围。
class Solution {
public:
bool canJump(vector<int>& nums) {
int cover=0;
for(int i=0;i<=cover;i++){
cover=max(nums[i]+i,cover);
if(cover>=nums.size()-1) return true;
}
return false;
}
};
跳跃游戏Ⅱ leetcode 45
定义两个变量当前遍历位置cur以及下一步最远到达位置next,当for循环控制i++等于cur的时候,就说明需要走一步了,当下一步覆盖范围大于或等于数组范围时break。
class Solution {
public:
int jump(vector<int>& nums) {
if(nums.size()==1) return 0;
int curDistance=0,nextDistance=0;
int res=0;
for(int i=0;i<nums.size();i++){
nextDistance=max(i+nums[i],nextDistance);
if(i==curDistance){
res++;
curDistance=nextDistance;
if(nextDistance>=nums.size()-1) break;
}
}
return res;
}
};
k次取反后最大化的数组和 leetcode 1005
依次对数组中最大的负数进行取反,对0进行取反,对最小的正数进行取反,直到k消耗完。
class Solution {
static bool cmp(int a,int b){
return abs(a)>abs(b);
}
public:
int largestSumAfterKNegations(vector<int>& nums, int k) {
sort(nums.begin(),nums.end(),cmp);
for(int i=0;i<nums.size();i++){
if(nums[i]<0&&k>0){
nums[i]*=-1;
k--;
}
}
while(k--){
nums[nums.size()-1]*=-1;
}
int res=0;
for(int i=0;i<nums.size();i++){
res+=nums[i];
}
return res;
}
};
总结
之所以把cmp实现为静态函数,是因为静态函数可以在类中不依赖对象独立存在,不需要实例化对象也可以在类内直接使用。