Given an unsorted array return whether an increasing subsequence of
length 3 exists or not in the array. More specifically, if there exists i , j , k such that arr[i] < arr[j] < arr[k] given 0 ≤ i < j < k ≤ n-1 return true else return false . Your function 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 .
实现代码
IncreasingTripletSubsequence.java
package array;
import java.util.Arrays;
import util.Print;
public class IncreasingTripletSubsequence {
/**
* 描述
Given an unsorted array return whether an increasing subsequence of length 3 exists or not in the array.
More specifically, if there exists i , j , k such that arr[i] < arr[j] < arr[k] given 0 ≤ i < j
< k ≤ n-1 return true else return false .
Your function 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 .
* 分析
对一个无序数组,判读递增3数列是否存在
* 直接解法
扫描数组,遍历三遍
* 复杂度
时间(n^3),空间 (1)
* @param nums
* @return
*/
public boolean Solution1(int[] nums){
int min=nums[0];
for(int i=0;i<nums.length;i++)
for(int j=i+1; j<nums.length;j++){
if(nums[i] >= nums[j])
continue;
for(int k=j+1;k<nums.length;k++){
if(nums[k]>nums[j]){
Print.Int(nums[i]);
Print.Int(nums[j]);
Print.Int(nums[k]);
return true;
}
}
}
return false;
}
/**
* 夹逼解法
对每一个i用j,k夹逼出结果
* 复杂度
时间O(n^2),,空间(1)
* @param nums
* @return
*/
public boolean Solution2(int[] nums){
for(int i=0;i<nums.length;i++){
int j = i+1;
int k = nums.length-1;
while(j<k){
while(nums[i]>=nums[j] && j<k) j++;
while(nums[j]>=nums[k] && j<k ) k--;
if(j<k) {
Print.Int(nums[i]);
Print.Int(nums[j]);
Print.Int(nums[k]);
return true;
}
//else break;
}
}
return false;
}
/**
* 时间优化解法
* 分析
扫描一遍数组,用变量 x1 保存当前最小的值,变量 x2 保存当前第二小的值。如果右面能碰到一个数大于 x2 ,说明必然存在一个递增的三元组。
* 复杂度
空间(1),时间(n)
*/
public boolean Solution3(int[] nums){
int x1=Integer.MAX_VALUE, x2=Integer.MAX_VALUE;
for(int i=0;i<nums.length;i++){
if(nums[i]<x1) x1=nums[i];
else if (nums[i]<x2) x2=nums[i];
else return true;
}
return false;
}
}
测试代码
IncreasingTripletSubsequenceTest.java
package array;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class IncreasingTripletSubsequenceTest {
private IncreasingTripletSubsequence s;
@Before
public void setUp() {
s = new IncreasingTripletSubsequence();
}
@Test
public void testSolution1() {
int[] nums = {3,4,1,7,5,2};
boolean expect = true;
boolean result = s.Solution1(nums);
System.out.println(result);
Assert.assertEquals(expect, result);
}
@Test
public void testSolution2() {
int[] nums ={9,1,6,8,7};
boolean expect = true;
boolean result = s.Solution2(nums);
System.out.println(result);
Assert.assertEquals(expect, result);
}
@Test
public void testSolution3() {
int[] nums ={5,4,3,2,1};
boolean expect = false;
boolean result = s.Solution3(nums);
System.out.println(result);
Assert.assertEquals(expect, result);
}
}
结果
3 4 7 true
1 6 7 true
false
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。