贪心——递增的三元子序列
原题在这里,
概述题意:
在给定数组中,能否找到任意一组元素,下标和值都递增。
这个题我是被三元组给忽悠了,觉得很难,所以直接pass
然后后悔
解法一:
双向遍历,由于只需要找三个,那么从中间元素考虑,左边和右边分别维护最小最大值
对于维护过程也是只需要两次遍历即可,那么final即为O(3n),甚至可以进一步优化为O(2n)
class Solution { public: bool increasingTriplet(vector<int> &nums) { int l = nums.size(); vector<int> mx(nums), mi(nums); //维护最小值从左到右 for (int i = 1; i < l; ++i) mi[i] = min(mi[i], mi[i - 1]); //维护最大值从右到左 for (int i = l - 2; i >= 0; --i) { mx[i] = max(mx[i], mx[i + 1]); if (mi[i] < nums[i] && nums[i] < mx[i]) return true; } return false; } };
解法二:
贪心,一次遍历(伪码如下)
预定义x=nums[0],y=int_max,遍历过程:
如果找到元素z有y<z,那么return true;
      否则或者z>x,y=z
      否则,x=z
出循环 return false
如此贪心遍历完成即是。
code:
class Solution { public: bool increasingTriplet(vector<int> &nums) { int l = nums.size(), x = nums[0], y = 0x7fffffff; for (int i = 1; i < l; ++i) { int z = nums[i]; if (z > y) return true; else if (z > x) y = z; else x = z; } return false; } };
大
搜索
复制
                    
                
                
            
        
浙公网安备 33010602011771号