1. 程式人生 > >(Java) LeetCode 334. Increasing Triplet Subsequence —— 遞增的三元子序列

(Java) LeetCode 334. Increasing Triplet Subsequence —— 遞增的三元子序列

func 空間 enc HERE title ges AS ted 遞增

Given an unsorted array return whether an increasing subsequence of length 3 exists or not in the array.

Formally the function should:

Return true if there exists i, j, k
such that arr[i] < arr[j] < arr[k] given 0 ≤ i < j < kn-1 else return false.

Your algorithm should run in O(n) time complexity and O(1

) space complexity.

Examples:
Given [1, 2, 3, 4, 5],
return true.

Given [5, 4, 3, 2, 1],
return false.


這道題和LeetCode 300. Longest Increasing Subsequence —— 最長上升子序列其實是一樣的,只是增加了時間和空間復雜度的限制。其實因為只是判斷是否有三元遞增序列,那麽當list中的元素達到三個,就可以返回ture,並且每次尋找替換元素的時候只是在兩個之中選個大的,所以所謂的二項搜索其實也是只用了常數級的時間。所以其實基於第300題稍作修改就可以得到可以通過的代碼。

優化的話其實就是把修改的過程翻譯過來,設置兩個變量num1,num2,初始設為最大值。遍歷數組,如果有比num1小的,就把num1換成那個元素,如果有比num1大且比num2小的,把num2換掉,這兩步其實是在模擬第300題中元素的替換。最後,當存在比num1和num2都大的數,那麽就可以直接返回true了,這一步相當於模擬list.size() == 3。


Java

class Solution {
    public boolean increasingTriplet(int[] nums) {
        int num1 = Integer.MAX_VALUE, num2 = Integer.MAX_VALUE;
        
for (int i = 0; i < nums.length; i++) { if (nums[i] < num1) num1 = nums[i]; else if (nums[i] > num1 && nums[i] < num2) num2 = nums[i]; else if (nums[i] > num2) return true; } return false; } }

(Java) LeetCode 334. Increasing Triplet Subsequence —— 遞增的三元子序列