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) space complexity.
Examples:
Given [1, 2, 3, 4, 5]
,
return true
.
Given [5, 4, 3, 2, 1]
,
return false
.
题目大意:
给一个没有排序的整数数组,如果数组存在三个数依次递增,返回true,否则返回false。其中三个数位置关系满足:array[i] < array[j] < array[k], i < j < k
也就是说,三个数以及数组中的位置只要依次递增即可。
思路一:
遍历数组中的所有元素,三个数组和的所有情况,枚举所有可能进行判断
简单粗暴,时间复杂度较高O(N ^ 3),空间复杂度O(1)
1 public class Solution { 2 public boolean increasingTriplet(int[] nums) { 3 if(nums == null || nums.length < 3) 4 return false; 5 boolean found = false; 6 for(int i = 0; i < nums.length - 2 && !found; i++){ 7 for(int j = i + 1; j < nums.length - 1 && !found; j++){ 8 for(int k = j + 1; k < nums.length; k++){ 9 if(nums[i] < nums[j] && nums[j] < nums[k]){ 10 found = true; 11 break; 12 }//if 13 }//for k 14 }//for j 15 }//for i 16 17 return found; 18 }//increasingTriplet 19 }
java写的,运行时间166ms
思路二:
刷了好几道这种题,题目也有提示,存在O(N)的解决方案。根据经验,个人觉得没必要例举所有的可能性,我们要直接奔着结果去,看结果需要什么。没必要把不必要的的找出来,增加复杂度。这道题我其实有思路,但没想通,看了讨论区一个用C++写的。我跟他的想法方向一致,不过还是没有想出来。
照着他的思路写了一下java版的
1 public class Solution { 2 public boolean increasingTriplet(int[] nums) { 3 if(nums == null || nums.length < 3) 4 return false; 5 int min = Integer.MAX_VALUE; 6 int mid = Integer.MAX_VALUE; 7 for(int num : nums){ 8 if(num < min) 9 min = num; 10 else if(num > min){ 11 if(num > mid) 12 return true; 13 mid = num; 14 }//else 15 }//for 16 17 return false; 18 }//increasingTriplet 19 }
运行时间1ms
讨论区c++解决方案链接:https://leetcode.com/discuss/95137/my-c-o-n-solution