2454. 下一个更大元素 IV --力扣 --JAVA

简介: 给你一个下标从 0 开始的非负整数数组 nums 。对于 nums 中每一个整数,你必须找到对应元素的 第二大 整数。如果 nums[j] 满足以下条件,那么我们称它为 nums[i] 的 第二大 整数:j > inums[j] > nums[i]恰好存在 一个 k 满足 i < k < j 且 nums[k] > nums[i] 。如果不存在 nums[j] ,那么第二大整数为 -1 。比方说,数组 [1, 2, 4, 3] 中,1 的第二大整数是 4 ,2 的第二大整数是 3 ,3 和 4 的第二大整数是 -1 。请你返回一个整数数组 answer ,其中 answer

 题目

给你一个下标从 0 开始的非负整数数组 nums 。对于 nums 中每一个整数,你必须找到对应元素的 第二大 整数。

如果 nums[j] 满足以下条件,那么我们称它为 nums[i]第二大 整数:

    • j > i
    • nums[j] > nums[i]
    • 恰好存在 一个k 满足 i < k < jnums[k] > nums[i]

    如果不存在 nums[j] ,那么第二大整数为 -1

      • 比方说,数组 [1, 2, 4, 3] 中,1 的第二大整数是 42 的第二大整数是 334 的第二大整数是 -1

      请你返回一个整数数组 answer ,其中 answer[i] nums[i] 的第二大整数。

      解题思路

        1. 最后两个一定为-1,因为右侧不足两个,不存在第二大整数;
        2. 倒序遍历,可以利用重复数据;
        3. 分情况讨乱,利用重复数据进行赋值。

        代码展示

        class Solution {
            public int[] secondGreaterElement(int[] nums) {
                int n = nums.length;
                int[] ans = new int[n];
                Arrays.fill(ans,-1);
                for (int i = n - 3; i >= 0; i--){
                    int flag = 0;
                    for (int j = i + 1; j < n; j++){
                        if(nums[j] > nums[i]){
                            if(++flag == 2){
                                ans[i] = nums[j];
                                break;
                            }
                        } else if (nums[j] == nums[i]){
                            if(flag == 0){
                                ans[i] = ans[j];
                                break;
                            }
                        } else {
                            if(ans[j] == -1 && flag == 0){
                                break;
                            }
                        }
                    }
                }
                return ans;
            }
        }

        image.gif


        目录
        相关文章
        |
        27天前
        |
        存储 Java
        深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
        【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
        38 3
        |
        27天前
        |
        Java
        在Java的世界里,Set只接纳独一无二的元素。
        【10月更文挑战第16天】在Java的世界里,Set只接纳独一无二的元素。本文通过拟人化的手法,讲述了重复元素从初次尝试加入Set被拒绝,到经历挣扎、反思,最终通过改变自己,成为独特个体并被Set接纳的全过程。示例代码展示了这一过程的技术实现。
        24 1
        |
        5天前
        |
        Java
        那些与Java Set擦肩而过的重复元素,都经历了什么?
        在Java的世界里,Set如同一位浪漫而坚定的恋人,只对独一无二的元素情有独钟。重复元素虽屡遭拒绝,但通过反思和成长,最终变得独特,赢得了Set的认可。示例代码展示了这一过程,揭示了成长与独特性的浪漫故事。
        13 4
        |
        12天前
        |
        存储 Java
        判断一个元素是否在 Java 中的 Set 集合中
        【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
        |
        10天前
        |
        存储 算法 Java
        为什么Java Set如此“挑剔”,连重复元素都容不下?
        在Java的集合框架中,Set是一个独特的接口,它严格要求元素不重复,适用于需要唯一性约束的场景。Set通过内部数据结构(如哈希表或红黑树)和算法(如哈希值和equals()方法)实现这一特性,自动过滤重复元素,简化处理逻辑。示例代码展示了Set如何自动忽略重复元素。
        18 1
        |
        27天前
        |
        存储 Java 数据处理
        Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。
        【10月更文挑战第16天】Java Set:无序之美,不重复之魅!Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。通过 hashCode() 和 equals() 方法实现唯一性,适用于需要唯一性约束的数据处理。示例代码展示了如何使用 HashSet 添加和遍历元素,体现了 Set 的高效性和简洁性。
        27 4
        |
        27天前
        |
        Java 开发者
        在Java集合世界中,Set以其独特的特性脱颖而出,专门应对重复元素
        在Java集合世界中,Set以其独特的特性脱颖而出,专门应对重复元素。通过哈希表和红黑树两种模式,Set能够高效地识别并拒绝重复元素的入侵,确保集合的纯净。无论是HashSet还是TreeSet,都能在不同的场景下发挥出色的表现,成为开发者手中的利器。
        26 2
        |
        9天前
        |
        安全 Java 测试技术
        Java并行流陷阱:为什么指定线程池可能是个坏主意
        本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
        |
        5天前
        |
        安全 Java 开发者
        深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
        在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
        25 9
        |
        8天前
        |
        存储 安全 Java
        Java多线程编程的艺术:从基础到实践####
        本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####