class Solution {
public:
int maxProfit(vector<int>& prices) {
int result=0, pre=prices[0];
for(int i=0;i<prices.size();i++){
if(pre<prices[i]){
result+=(prices[i]-pre);
pre=prices[i];
}else if(pre>prices[i]){
pre=prices[i];
}
}
return result;
}
};
这题实际上就是求增量,指对序列中有增量的相邻元素做计算,下降的部分不做处理。是一种开天眼式的炒股计算)
class Solution {
public:
bool canJump(vector<int>& nums) {
int rg=0;
for(int i=0;i<nums.size();i++){
if(i>rg) return false;
if((i+nums[i])>rg) rg=i+nums[i];
}
return true;
}
};
这题笔者一下子没想到,只想到暴力求解,看了眼随想录的思路,看到范围俩字就悟了,从一个位置开始由最大跳数就可以求的在一个位置下一步最远能到哪的范围,对最大范围内的元素遍历,找到更大的最大范围,直到遍历完序列中的所有元素,或超过最大范围,如果是因为超出最大范围结束,表明无法跳到序列尾。
class Solution {
public:
int jump(vector<int>& nums) {
vector<int>step(nums.size(),INT_MAX);
step[0]=0;
for(int i=0;i<nums.size();i++){
for(int rg=nums[i];rg>0;rg--){
if(i+rg<nums.size()){
if(step[i+rg]>(step[i]+1)) step[i+rg]=step[i]+1;
}
}
}
return step[nums.size()-1];
}
};
这题笔者从上一题的思路开始延伸,这题在保证序列可达序列尾的条件下求取最小跳数。所以用step承担记录范围与最小跳数的功能。
class Solution {
public:
int largestSumAfterKNegations(vector<int>& nums, int k) {
int result=0, mn=INT_MAX;
sort(nums.begin(), nums.end());
for(int i=0;i<nums.size();i++){
if(nums[i]<0&&k>0){
nums[i]=-nums[i];
k--;
}
if(nums[i]>=0&&mn>nums[i]) mn=nums[i];
result+=nums[i];
}
if(k%2==1) result-=2*mn;
return result;
}
};
这题由几种可能性,第一种是是负数多余反转次数,需要将反转次数给尽可能小的负数,第二种是负数少于反转次数且所有负数反转后反转次数为偶,表明将所有数转为正再求和即可,第三种是所有负数反转后反转次数为奇,则需要选一个绝对值最小的数作为唯一的负数。