首页 > 其他分享 >496. 下一个更大元素 I

496. 下一个更大元素 I

时间:2023-04-07 21:33:43浏览次数:58  
标签:index int 复杂度 元素 vector 更大 496 n2 nums2

题目链接:496. 下一个更大元素 I

方法一:模拟 + 哈希表

解题思路

通过哈希表存储,\(nums\) 数组中元素对应的坐标,元素->坐标。
然后模拟查找过程。

代码

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        unordered_map<int, int> index;
        int n1 = nums1.size(), n2 = nums2.size();
        for (int i = 0; i < n2; i ++ ) index[nums2[i]] = i;
        vector<int> ans;
        for (int i = 0; i < n1; i ++ ) {
            int x = nums1[i];
            int x_index = index[x];
            int j; bool flag = false;
            for (j = x_index + 1; j < n2; j ++ ){
                if (nums2[j] > x) {
                    flag = true;
                    break;
                }
            }
            if (flag) ans.emplace_back(nums2[j]);
            else ans.emplace_back(-1);
        }
        return ans;
    }
};

复杂度分析

时间复杂度:\(O(n1 * n2)\),\(n1\) 和 \(n2\) 分别为 \(nums1\) 和 \(nums2\) 数组的长度;
空间复杂度:\(O(n2)\)。

方法二:单调栈

解题思路

单调栈解决 Next Greater Number 一类问题

代码

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        int index[10001]; // index[i],表示数字i,在nums2数组中下一个更大数字的下标
        vector<int> ans;
        stack<int> stk; // 存放下标
        for (int i = nums2.size() - 1; i >= 0; i -- ) {
            while (!stk.empty() && nums2[stk.top()] <= nums2[i]) stk.pop();
            index[nums2[i]] = stk.empty() ? -1 : stk.top();
            stk.push(i);
        }
        for (int i = 0; i < nums1.size(); i ++ ){
            if (index[nums1[i]] == -1) ans.emplace_back(-1);
            else ans.emplace_back(nums2[index[nums1[i]]]);
        }
        return ans;
    }
};

复杂度分析

时间复杂度:\(O(n1 + n2)\),\(n1\) 和 \(n2\) 分别为 \(nums1\) 和 \(nums2\) 数组的长度;
空间复杂度:\(O(n)\),\(n\) 为 \(index\) 数组长度。

标签:index,int,复杂度,元素,vector,更大,496,n2,nums2
From: https://www.cnblogs.com/lxycoding/p/17297432.html

相关文章

  • 删除重复元素
    linkcode#include<iostream>#include<unordered_map>usingnamespacestd;intmain(){ unordered_map<char,int>mp; strings; cin>>s; for(inti=0;i<s.size();i++){ mp[s[i]]++; } stringtp=""; for(inti......
  • 给定一个list和一个int数值,循环打印固定范围内list的元素
    比如有一个list,里面有“1,2,3,4,5,6,7,8”这八个元素,再给一个int数值,比如是3,那打印结果就是第一次:1,2,3第二次:4,5,6第三次:7,8,1第四次:2,3,4依次类推...publicstaticvoidmain(String[]args){intstrength=3;List<Integer>indexList=new......
  • 数组里有n个元素,取第一个元素和最后一个元素时间差会很大吗?
    其实呢,不要被这个所迷惑了,数组里面呢无论有多少个元素,它都是通过key值去精确查找哈希表的过程,所以呢,它们所消耗的时间呢,基本就是差不多的,当然,可能会有一些差异,但这个差异的话,可以忽略不计。......
  • html 元素定位与接口请求总结
    1.下拉框环境:测试生产 <selectid="sid"onchange=""style="margin-right:20px;width:100px;"><optionid="dev"value="dev">测试</option><optionid="prod"value="prod"......
  • 元素的多重排序
    应用场景:渲染用户界面时,因为关键的消息和特殊的事件应该优先显示在其他信息之前。numbers=[8,3,1,2,5,4,7,6]//原始数据group={8,3,5,7}//优先级高的数据,defsort_priority(numbers,group):found=Falsedefhelper(x):nonlocalfoun......
  • JavaScript中数组元素删除的七大方法汇总
    原文链接:https://blog.csdn.net/u010323023/article/details/52700770 在JavaScript中,除了Object之外,Array类型恐怕就是最常用的类型了。与其他语言的数组有着很大的区别,JavaScript中的Array非常灵活。今天我就来总结了一下JavaScript中Array删除的方法。大致的分类可以分为如下......
  • DOM:让一个元素跟随鼠标移动而移动
    <!DOCTYPEhtml><htmllang="en"><head>  <metacharset="UTF-8">  <metahttp-equiv="X-UA-Compatible"content="IE=edge">  <metaname="viewport"content="width=......
  • 如何在vue3获取 DOM 元素
    获取dom的ref元素名称,要对应暴露的名称,不然会出现无效的dom报错,也就是拿到的是null在setup中,使用ref(null)获取dom不能直接在setup里面拿到dom的值,因为setup对应的生命周期是created,所以必须在后续的生命周期钩子里面拿到,比如onMounted注意:ref不要加冒号,直接写dom元素名称......
  • JavaScript:数组删除指定元素
    1.shift()方法用于删除数组中的第一个元素。注:此方法会改变数组的长度letarr=[1,2,3]arr.shift()//删除1//arr为[2,3]2.pop()方法用于删除数组中最后一个元素注:此方法会改变数组的长度letarr=[1,2,3]arr.pop();//删除3//arr为[1,2]3.splice()方法用于......
  • List集合之元素和对象去重
    目录1List元素去重1.1移除List中指定某一元素1.1.1For循环移除1.1.1.1For移除不彻底问题1.1.1.2用i--解决问题1.1.1.3倒序遍历移除元素1.1.2ForEach移除1.1.2.1ConcurrentModificationException异常1.1.2.2iterator遍历1.2移除List中重复元素1.2.1ForEach添加去重1.2......