(Java) LeetCode 334. Increasing Triplet Subsequence —— 遞增的三元子序列
阿新 • • 發佈:2018-06-30
func 空間 enc HERE title ges AS ted 遞增 ) space complexity.
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 < k ≤ n-1 else return false.
Your algorithm should run in O(n) time complexity and O(1
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 —— 遞增的三元子序列