采用dp算法,计算最长不减子序列,超时了,尴尬!!
class Solution {
public:
bool checkPossibility(vector<int>& nums) {
vector<int> dp(nums.size(),1);
int max=1;
for(int i=nums.size()-2;i>=0;i--)
{
//dp[i]
for(int j=i+1;j<nums.size();j++)
{
if(nums[j]>=nums[i])
dp[i]=dp[i]>dp[j]+1?dp[i]:dp[j]+1;
}
max = max>dp[i]?max:dp[i];
}
/*
for(int i=0;i<nums.size();i++)
cout<<dp[i]<<" ";
*/
if(max>=nums.size()-1)
return true;
else
return false;
}
};
参考了别人的代码,直接从前往后开始查找,遇到问题太大的直接break,采用迷之贪心算法,解决这种特殊的问题
class Solution {
public:
bool checkPossibility(vector<int>& nums) {
int cnt=0;
for(int i=1;i<nums.size();i++)
{
if(nums[i]<nums[i-1])
{
if(i-2<0)
nums[i-1]=nums[i];
else{
if(nums[i]<nums[i-2])
nums[i]=nums[i-1];
else // (nums[i]>=nums[i-2])
nums[i-1]=nums[i];
}
cnt++;
if(cnt>1)
break;
}
}
return cnt<=1;
}
};