• 137、LeetCode-503.下一个更大元素Ⅱ


    题目:

    给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。

    数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1 。

    示例 1:

    输入: nums = [1,2,1]
    输出: [2,-1,2]
    解释: 第一个 1 的下一个更大的数是 2;
    数字 2 找不到下一个更大的数; 
    第二个 1 的下一个最大的数需要循环搜索,结果也是 2。

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/next-greater-element-ii

    思路:

    本题是将数组变为循环数组:因此单调栈的查找需要 2*N的长度;

    创建一个新的数组,然后进行单调栈的判断,同时需要判断下标是否越界

    代码:

    1)单调栈思想

    1. class Solution {
    2. public int[] nextGreaterElements(int[] nums) {
    3. //两个数组拼成一个,时间复杂度为 o(2N)
    4. int l = nums.length;
    5. int[] nums1 = new int[2 * l];
    6. //将新的数组赋值
    7. for(int i = 0;i < 2 * l;i++){
    8. nums1[i] = nums[i % l];
    9. }
    10. int[] res = new int[l];
    11. Arrays.fill(res,-1);
    12. Stack stack = new Stack<>();
    13. for(int i = 0;i < 2 * l;i++){
    14. while(!stack.isEmpty() && nums1[i] > nums1[stack.peek()]){
    15. int index = stack.pop();
    16. if(index < l){
    17. res[index] = nums1[i];
    18. }
    19. }
    20. stack.push(i);//这次往里面放下标
    21. }
    22. return res;
    23. }
    24. }

    同样可以不构件新的数组,直接在原有的数组基础上,每次都取余即可

    1. class Solution {
    2. public int[] nextGreaterElements(int[] nums) {
    3. //两个数组拼成一个,时间复杂度为 o(2N)
    4. int l = nums.length;
    5. int[] res = new int[l];
    6. Arrays.fill(res,-1);
    7. Stack stack = new Stack<>();
    8. for(int i = 0;i < 2 * l;i++){
    9. while(!stack.isEmpty() && nums[i % l] > nums[stack.peek() % l]){
    10. int index = stack.pop();
    11. if(index < l){
    12. res[index] = nums[i % l];
    13. }
    14. }
    15. stack.push(i);//这次往里面放下标
    16. }
    17. return res;
    18. }
    19. }

    可以继续简化,判断条件

    1. class Solution {
    2. public int[] nextGreaterElements(int[] nums) {
    3. //两个数组拼成一个,时间复杂度为 o(2N)
    4. int l = nums.length;
    5. int[] res = new int[l];
    6. Arrays.fill(res,-1);
    7. Stack stack = new Stack<>();
    8. for(int i = 0;i < 2 * l;i++){
    9. while(!stack.isEmpty() && nums[i % l] > nums[stack.peek()]){
    10. res[stack.pop()] = nums[i % l];
    11. }
    12. if(i < l)
    13. stack.push(i);//这次往里面放下标
    14. }
    15. return res;
    16. }
    17. }

  • 相关阅读:
    从0开始编写BP,附加动量因子的BP神经网络,不使用MATLAB工具箱,纯手写matlab代码,以BP分类为例...
    OpenWrt之package: Using Dependencies
    rocketmq-5.1.2的dleger高可用集群部署
    git教程(1)---本地仓库操作
    java计算机毕业设计西安市城市绿地管理系统源码+系统+数据库+lw文档
    Spring原理:PostProcessor与AOP原理
    SSM项目
    【区块链】联盟链
    基于5G工业CPE打造智慧煤矿无人巡检监测应用
    手动dump失败问题
  • 原文地址:https://blog.csdn.net/weixin_54532276/article/details/126773720