122.买卖股票的最佳时机
给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。
在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
返回 你能获得的 最大 利润 。
思路: 最大利润2虽然是中等题,但并不难,就是局部最优推出整体最优,当后一天的价格大于前一天时,就将其卖出记录利润,此时就是把利润分解为每天为单位的维度,而不是从 0 天到第 3 天整体去考虑
假如第 0 天买入,第 3 天卖出,那么利润为:prices[3] - prices[0]。
相当于(prices[3] - prices[2]) + (prices[2] - prices[1]) + (prices[1] - prices[0])。
从而得出:局部最优:收集每天的正利润,全局最优:求得最大利润。
class Solution {
public:int maxProfit(vector<int>& prices) {int money=0;for(int i=1;i<prices.size();i++){if(prices[i]-prices[i-1]>0){money+=prices[i]-prices[i-1];}}return money;}
};
55.跳跃游戏:
给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。
思路:定义一个变量,局部最优是尽可能覆盖较大的值,全局最优是得到整体覆盖的最大范围,看看能否达到最优解。想要取最大范围,就要取max(该元素数值补充后的范围, cover 本身范围)。
class Solution {
public:bool canJump(vector<int>& nums) {int cover=0;if(nums.size()==1) return true;for(int i=0;i<=cover;i++){cover=max(nums[i]+i,cover);if(cover>=nums.size()-1){return true;}}return false;}
};
1005.k次取反后最大化数字和
给你一个整数数组
nums
和一个整数k
,按以下方法修改该数组:
- 选择某个下标
i
并将nums[i]
替换为-nums[i]
。重复这个过程恰好
k
次。可以多次选择同一个下标i
。以这种方式修改数组后,返回数组 可能的最大和 。
思路:此题也是经典的贪心法,局部最优是让绝对值大的负数变成正数,全局最优:数组和达到最大
首先,将数组排序,定义一个自定义静态函数,让绝对值最大的数排在前面,然后for循环遍历,如果k大于0且nums的值小于0,将其乘-1,k--,遍历完成后,如果此时k不为0,代表数组中只剩下正数了,就去数组中最小的数,将他变为负数,最后将数组的所有元素相加。
class Solution {
public: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(k>0&&nums[i]<0){nums[i]*=-1;k--;}}if(k%2==1)//如果为奇数,取数值中最小的正数nums[nums.size()-1]*=-1;int sum=0;for(int a:nums){sum+=a;}return sum;}
};