递增的三元子序列
给你一个整数数组 nums ,判断这个数组中是否存在长度为 3 的递增子序列。
如果存在这样的三元组下标 (i, j, k) 且满足 i < j < k ,使得 nums[i] < nums[j] < nums[k] ,返回 true ;否则,返回 false 。
示例 1:
输入:nums = [1,2,3,4,5]
输出:true
解释:任何 i < j < k 的三元组都满足题意
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-medium/xvvuqg/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
贪心
这道题要求找出递增子序列,但是感觉示例和说明没有说清楚,就是这个子序列的元素可以是不相连的(我以为是相连的直接提交了一次。。)。
如果是相连的就可以设置两个循环,外层指针不断移动,内层再设置一个循环若符合当前元素大于前一个元素(前一个元素可以用一个变量存储)时指针后移,移动两次后返回true。
若果元素可以不相连,我认为反而放宽了条件。设置两个指针持续指向当前遍历数组的最小元素和次小元素。当当前遍历到的元素大于次小元素时返回true。
代码:
public boolean increasingTriplet(int[] nums) {
int maxMin = Integer.MAX_VALUE;
int secondMin = maxMin;
for(int i = 0; i < nums.length; i++){
if(nums[i] < maxMin ){
maxMin = nums[i];
}else if(nums[i] > maxMin && nums[i] < secondMin){
secondMin = nums[i];
}else if(nums[i] > secondMin){
return true;
}else{
continue;
}
}
return false;
}
我觉得真正上这个问题上了难度(对于我来说)的是一个测试用例{4,3,2,3,1,4}
之前我的代码在
if(nums[i] < maxMin ){
maxMin = nums[i];
}
处傻傻的添加了一句secondMin = Integer.MAX_VALUE;意在最小值更新时次小值也重新开始更新。依次来达到求得一个递增序列的目的。不过当输入的是上面的测试用例时,maxMin会指向1,secondMin会指向4。循环结束会返回false。然而实际上可以看到这个用例是存在一个序列2,3,4的。
那么为什么不需要在最小值更新的时候重置次小值?其实这里是有一个隐含条件的次小值指向的元素前面一定会有一个更小的值。每次循环i时,实际上是在同时检查最小值和次小值是否匹配,例如上述用例结束时maxMin会指向1,secondMin会指向3。3之前实际还有个更小的2,i遍历到4时匹配。返回true。
所以,可以看出来,解决这种问题最好还是设置多指针。每个指针都含有一个隐藏条件:前面会有一更小的元素。即贪心的思想。
浙公网安备 33010602011771号