栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

LeetCode——334.递增的三元子序列

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode——334.递增的三元子序列

大佬,牛!!!

题目:给定一个数组,然后看看数组中有增的三个数。我的思路:没有想到很好的方式,我的一个思路是用map进行存储,但是不知道存储什么。然后就准备暴力了。当然一定会超过时间复杂度的。大佬的思路:直接先说最好的方法因为这个最好的方法并不难。就是三个数i,j,k,要想满足,则j应该尽可能地小,然后i一定是小于j的,然后再找到一个k大于j就可以了。关键就是我们要保证j一定是一直大于i的。知道这个以后,我们就开始设置这三个数首先让i等于第一个,第二个先设置一个最大的数。然后遍历这个数组,首先判断这个数是不是比j大,要是比j大,而我们保证了j比i大,这样直接返回就行了。要是没有比j大,则判断是不是比i大,要是比i大的话,那么就让j等于他,因为这是一个在i和j之间的数,这就是我们要贪心的j要尽可能的小。要是比j还小,那就直接给i就行了。因为比j小的我们要记录的就是i。技巧:

这里就是贪心,这个题目还是比较有意思的,主要是他贪心的是中间这一个。不过确实也是,贪心其他两个都不合适。我压根就没想到这个咱们进行贪心。这里不要陷入误区,就是让很小的数给了i以后,那么j还能在i的右边么。如果执行一次以后,确实不一定。但是我们之前是保证的,至少j在右边,现在这一步将更小的给了i,可以理解为增加了i到j的区间,这样j可以贪心到更小的,下次贪心的时候,就在这个i的右边了。至于你现在在不在,只要j不变化,我们就保证是在的,而j的变化是要大于i的。如果没有下次贪心,那么j还是不变的,虽然这个i不一定在j的左边,但是一定有一个是小于j的,在j的左边。这也就是为什么这个题比较巧妙的地方。

伪代码

首先如果数组长度小于3,则直接返回false
然后定义i等于nums[0],然后j的话直接定义一个最大的。首先这样满足了我们的前提条件。
然后就遍历数组就可以了,从1位置开始,变量为a
    如果这个数大于j,也就是说我们已经找到,直接返回true
    否则,也就是这个数小于j,我们需要判断比i大,因为如果比i大,这就是我们要贪心的j,这时候让j等于这个nums[a]。
    在否则,也就是这个数小于j,还小于i,则直接给i就行了。
然后最后返回false。因为如果上面有,就已经直接返回了

java代码——暴力,但是超时

class Solution {
    public boolean increasingTriplet(int[] nums) {
        if (nums.length < 3) return false;
        for (int i = 0; i < nums.length - 2; i++) {
            for (int j = i; j < nums.length - 1; j++) {
                if (nums[i] >= nums[j]) continue;
                for (int k = j; k < nums.length; k++) {
                    if (nums[j] < nums[k]) return true;
                }
            }
        }
        return false;
    }
}

java代码——贪心

class Solution {
    public boolean increasingTriplet(int[] nums) {
        if (nums.length < 3) return false;
        int i = nums[0], j = Integer.MAX_VALUE, k;
        for (int l = 0; l < nums.length; l++) {
            k = nums[l];
            if (k > j) return true;// 我们保证了j>i,现在k>j。所以直接return true
            else if (k > i) j = k;// k是在i和j之间的,这时候我们的j要贪心小的,更新一下j,只要贪心不到,j就不变
            else i = k;// 这个k比i还要小,这是为了增加i-j之间的区间长度,让j可以贪心到更小的,只要贪心到了,那么这个i就在j的左边。如果贪心不到(贪心不到j就不变),那么之前的时候我们也保证了j的左边是有比j小的
        }
        return false;
    }
}

总结:题目的代码比较少,但是这个贪心确实很精华。我们虽然不能保证i一定是小于j的,但是我们保证了j的左边一定有小于j的。附上大佬的链接。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/705219.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号