- 股票最大收益|
第i天的最大收益=max(第i-1天的最大收益,price[i]-min_price[i-1])(dp的思想)
击败5%的用户-_-
class Solution {
public:
int maxProfit(vector<int>& prices) {
//双指针对于无序数组比较弱鸡
int max_pro = 0;
if(prices.empty())
return 0;
int buy = prices[0];
for(int i=1;i<prices.size();i++)
{
int diff = prices[i] - buy;
if(diff<0)
buy = prices[i];
else if(diff>max_pro)
max_pro = diff;
}
return max_pro;
}
};
代码优化一下:
for (int price: prices) {
maxprofit = max(maxprofit, price - minprice);
minprice = min(price, minprice);
}
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.size()==0)
return 0;
int buy=prices[0],g_max=0,l_max = 0;//设置一个局部最大值和一个全局最大值
// 类似于划分若干个互不重叠的区间
for(int & p:prices)
{
int diff = p-buy;
if(diff<0) //通过测试案例发现,这个条件判断是错的
//比如[2,1,2,0,1]
buy = p;
else if(diff<l_max)
{
buy = p;
g_max += l_max;
l_max = 0;
}
else
l_max = diff;
}
return g_max+l_max;
}
};
-
种植小花花
一开始的想法自然是如果数组中某个元素的上个元素为0、这个元素本身为0,且下个元素也为0,则n–。但是要单独讨论数组size为0 1 2 的情况。非常麻烦。
解答区看见了神仙解法: -
判断子序列
哈哈哈,5min中不到,双指针,愉快地解出,而且几乎是双百
class Solution {
public:
bool isSubsequence(string s, string t) {
int i=0,j=0;
while(j<t.size()&&i<s.size())
{
if(t[j]==s[i])
{
i++;
j++;
}
else
j++;
}
return i>=s.size();
}
};
官方解答还给出了dp的方法,太难了,不想看。
- 修改一个数成为非递减数列
强行打上各种布丁后终于通过了:
class Solution {
public:
bool checkPossibility(vector<int>& nums) {
int flag=0; //记录修改的次数,应该小于2
int i=0;
for(;i<nums.size()-1&&flag<2;i++)
{
if(nums[i]<=nums[i+1])
continue;
else if(nums[i]>nums[i+1])
{
if(i==0 || nums[i+1]>=nums[i-1] || i==nums.size()-2) //布丁1[1,2,3,1]
flag++;
else if(i<nums.size()-2 && nums[i+2]>nums[i]) //补丁2[1,2,3,1,4]
flag++;
else
return false;
}
}
return (flag<2);
}
};
看了答案,发现我的解法还不赖~