Leetcode題解中級篇之陣列和字串(6)遞增的三元子序列
阿新 • • 發佈:2018-12-27
題目描述:
給定一個未排序的陣列,判斷這個陣列中是否存在長度為 3 的遞增子序列。
數學表示式如下:
如果存在這樣的 i, j, k, 且滿足 0 ≤ i < j < k ≤ n-1,
使得 arr[i] < arr[j]< arr[k] ,返回 true ; 否則返回 false 。
說明: 要求演算法的時間複雜度為 O(n),空間複雜度為 O(1) 。
示例 1:
輸入: [1,2,3,4,5]
輸出: true
示例 2:
輸入: [5,4,3,2,1]
輸出: false
思路: 一開始想用動態規劃 用dp[]記錄每個位置已經滿足i<j,nums[i]<nums[j] 條件的狀態. 1 ,2 ,3 則dp[2]=3跳出. 可是要求空間複雜度為1 ,而且仔細想了下太多餘了. 感覺用雙指標+一個計數count 能解決.結果,不斷除錯都AC不了100%
看了大神的思路.
思路有點類似動態規劃的思想,維護一個二元組(first,second),記錄第i個元素之前的“最小”遞增二元子序列(對後續元素的要求最低如[5,6,2,3,4]會更新[5,6]為[2,3]此時只要後續滿足大於3就可以)
當nums[i]小於first時,更新first的值
當nums[i]>first且nums[i]
原文:https://blog.csdn.net/whdAlive/article/details/80404875
程式碼:
class Solution { public boolean increasingTriplet(int[] nums) { int first = Integer.MAX_VALUE,second = Integer.MAX_VALUE; if(nums.length<3){ return false; } for(int num:nums){ if(first>num){ first = num; }else if(first<num && second>num){ second = num; }else if(num>second){ return true; } } return false; } } //空間複雜度為O(n) public class Solution{ public boolean increasing Triplet(int []nums){ if(nums.lendth<2) return false; int n =nums.lendth; boolean[]has_first_small =new booleam[n]; int smallest =num[0]; has_first_small[0]=false; for(int i=0;i<n;i++){ if(smallest <num[i]){ has_first_small[i]=true; smallest =Math.min(smallest,num[i]); } int biggest =num[n-1]; for(int i=n-2;i>=0;i--){ if(has_first_small[i]==true){ if(num[i]<biggest){ return true; } biggest =Math.max(biggest,num[i]); } } return false; } }