1. 程式人生 > >Leetcode題解中級篇之陣列和字串(6)遞增的三元子序列

Leetcode題解中級篇之陣列和字串(6)遞增的三元子序列

題目:https://leetcode-cn.com/explore/interview/card/top-interview-questions-medium/29/array-and-strings/80/

題目描述:

給定一個未排序的陣列,判斷這個陣列中是否存在長度為 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;
	}
}