赞
踩
思路:状态dp[i]表示的是:以第i个点为结尾的最长交替子数组,时间复杂度0(n),细节看注释
class Solution { public: int alternatingSubarray(vector<int>& nums) { int n=nums.size(); int dp[110]; dp[0]=1; int maxx=1; for(int i=1;i<n;i++){ dp[i]=1; //如果和前面的数差为1 if(nums[i]-nums[i-1]==1){ //判断前面第二个数和当前数是否相等,相等,说明在dp[i-1]的基础上+1 if(i-2>=0&&nums[i]==nums[i-2]) dp[i]=dp[i-1]+1; else dp[i]=2; } //如果和前面的数差为-1 if(nums[i]-nums[i-1]==-1){ //判断前面第二个数和当前数是否相等,相等,说明在dp[i-1]的基础上+1,不然就不行。 if(i-2>=0&&nums[i]==nums[i-2]) dp[i]=dp[i-1]+1; } maxx=max(maxx,dp[i]); } if(maxx==1) maxx=-1; return maxx; } };
优化了一下空间
class Solution { public: int alternatingSubarray(vector<int>& nums) { int n=nums.size(); int cur=1; int maxx=1; for(int i=1;i<n;i++){ if(nums[i]-nums[i-1]==1){ if(i-2>=0&&nums[i]==nums[i-2]) cur++; else cur=2; }else if(nums[i]-nums[i-1]==-1){ if(i-2>=0&&nums[i]==nums[i-2]) cur++; else cur=1; }else cur=1; maxx=max(maxx,cur); } if(maxx==1) maxx=-1; return maxx; } };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。