问题描述

给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。

nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出-1。

示例 1:

输入: nums1 = [4,1,2], nums2 = [1,3,4,2].

输出: [-1,3,-1]

解释:

对于num1中的数字4,你无法在第二个数组中找到下一个更大的数字,因此输出 -1。

对于num1中的数字1,第二个数组中数字1右边的下一个较大数字是 3。

对于num1中的数字2,第二个数组中没有下一个更大的数字,因此输出 -1。


示例 2:

输入: nums1 = [2,4], nums2 = [1,2,3,4].

输出: [3,-1]

解释:

对于num1中的数字2,第二个数组中的下一个较大数字是3。

对于num1中的数字4,第二个数组中没有下一个更大的数字,因此输出 -1。


注意:

nums1和nums2中所有元素是唯一的。

nums1和nums2 的数组大小都不超过1000。

解题思路

首先在nums数组里面找到findNums每个元素的对应位置,找不到则直接存入-1;

找到之后从下一个元素开始(对应题目描述的右边),寻找比此元素大的元素下标,找到则存入下标所指向的元素。

否则就存入-1.

这个应该是最笨的方法了。。

假设findNums和nums长度分别为m和n,则此算法时间复杂度为O(mn),空间复杂度为O(1).

解题思路改进

这道题其实就是求nums数组每个元素右边第一个比它大的元素,不存在就是-1。

所以初始化一个map,大小与nums.size()相同,记录nums每个元素以及它右边第一个比他大的元素。

如何去寻找呢?

可以遍历nums数组,用栈的栈顶来记录每个元素temp右边的元素,直到找到一个比当前元素temp大的元素,将temp与该元素一起压入map。

如果找不到比temp大的元素,那么将temp与-1一起压入map。

当map初始化完毕后,就可以开始遍历findNums数组了。

根据findNums的元素值找到其在map中的映射,将映射依次加入vector容器即可。

假设findNums和nums长度为m和n,则时间复杂度为O(max(m,n)),空间复杂度为O(n),空间换时间。

举例

对于例1中的nums={1,3,4,2},先遍历nums来初始化map。

1)对于1,压入3,3比1大,1右边第一个比它大的数字找到,map[1]=3;

2)对于3,压入4,4比3大,3右边第一个比它大的数字找到,map[3]=4;

3)对于4,压入2,2比4小,2出栈。nums数组结束,4右边不存在比它大的数字,map[4]=-1;

4)对于2,2已经是nums最后一个数字,2右边不存在比它大的数字,map[2]=-1.

map初始化完成,接下来遍历findNums={4,1,2}。

1)map[findNums[0]]=map[4]=-1,-1加入vector

2)map[findNums[1]]=map[1]=3,3加入vector

3)map[findNums[2]]=map[2]=-1,-1加入vector

最后vector的结果就是{-1,3,-1},返回这个vector即可。

C++代码

class Solution {
public:
vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) {
int size1=findNums.size();
int size2=nums.size();
vector<int> result;
int flag=-1;
int index1,index2; for(int index1=0;index1<size1;++index1){ //每次初始化flag
flag=-1; //找到findNums[index1]在nums中的位置index2
for(index2=0;index2<size2;++index2){
if(findNums[index1]==nums[index2])
break;
} //找到合适数字及修改flag,跳出循环
for(;index2<size2;++index2){
if(findNums[index1]<nums[index2]){
flag=nums[index2];
break;
}
} //根据flag确定最后结果
result.push_back(flag);
} return result;
}
};

C++代码改进

class Solution {
public:
vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) {
//m_stack存放nums中元素的右边元素
//m_map存放nums每个元素的最终结果
std::stack<int> m_stack;
map<int,int> m_map; //遍历nums初始化m_map
for(int index=0;index<nums.size();++index){ //栈不空且当前元素大于站内元素
//栈内元素出栈并不断更新
while(!m_stack.empty() && nums[index]>m_stack.top()){
m_map[m_stack.top()]=nums[index];
m_stack.pop();
} //栈空存入元素
m_stack.push(nums[index]);
m_map[nums[index]]=-1;
} //遍历findNums
vector<int> result;
for(int index=0;index<findNums.size();++index){
result.push_back(m_map[findNums[index]]);
} return result;
}
};

运行结果1

运行结果2

参考资料

1、496. 下一个更大元素 I

LeetCode第496题:下一个更大元素 I的更多相关文章

  1. LeetCode 496. 下一个更大元素 I(Next Greater Element I) 35

    496. 下一个更大元素 I 496. Next Greater Element I 题目描述 给定两个没有重复元素的数组 nums1 和 nums2,其中 nums1 是 nums2 的子集.找到  ...

  2. Leetcode 496. 下一个更大元素 I

    1.题目描述 给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nums1 中数字  ...

  3. Java实现 LeetCode 496 下一个更大元素 I

    496. 下一个更大元素 I 给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nu ...

  4. 【LeetCode】496.下一个更大元素I

    496.下一个更大元素I 知识点:栈:HashMap: 题目描述 给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集. 请你找出 nums1 中每个元 ...

  5. Leetcode---栈系列刷题(python3实现)----#496 下一个更大元素I

    给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nums1 中数字 x 的下一个更 ...

  6. LeetCode:下一个更大元素I【31】

    LeetCode:下一个更大元素I[31] 题目描述 给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的 ...

  7. LeetCode 556. 下一个更大元素 III(Next Greater Element III)

    556. 下一个更大元素 III 556. Next Greater Element III 题目描述 给定一个 32 位正整数 n,你需要找到最小的 32 位整数,其与 n 中存在的位数完全相同,并 ...

  8. LeetCode 503. 下一个更大元素 II(Next Greater Element II)

    503. 下一个更大元素 II 503. Next Greater Element II 题目描述 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 ...

  9. [Leetcode]下一个更大元素II

    题目 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地 ...

随机推荐

  1. 【bzoj4987】Tree 树形背包dp

    题目描述 从前有棵树. 找出K个点A1,A2,…,Ak. 使得∑dis(AiAi+1),(1<=i<=K-1)最小. 输入 第一行两个正整数n,k,表示数的顶点数和需要选出的点个数. 接下 ...

  2. python_广州房价热力图

    调用百度地图api,获取经纬度数据,然后在调用百度地图api,生成热力图 import pandas as pd import numpy as np data = pd.read_excel(r'D ...

  3. django的settings文件

    转载:http://www.cnblogs.com/likeshan168/articles/3596344.html

  4. AMD 规范

    AMD(异步模块定义)是为浏览器环境设计的,因为 CommonJS 模块系统是同步加载的,当前浏览器环境还没有准备好同步加载模块的条件. AMD 定义了一套 JavaScript 模块依赖异步加载标准 ...

  5. SQL Server 学习系列之四(SQL 内幕)

    SQL Server 学习系列之四(SQL 内幕) SQL Server 学习系列之一(薪酬方案+基础) SQL Server 学习系列之二(日期格式问题) SQL Server 学习系列之三(SQL ...

  6. [转]移动端HTML5<video>视频播放优化实践

    遇到的挑战 移动端HTML5使用原生<video>标签播放视频,要做到两个基本原则,速度快和体验佳,先来分析一下这两个问题. 下载速度 以一个8s短视频为例,wifi环境下提供的高清视频达 ...

  7. spark流程跟踪

    每个action对应一个job,每个job里面会有很多个阶段(stage),其实每个stage都是一个算子(Operation),可能是transformation,可能是action:但是actio ...

  8. CentOS 7.2 PowerShell下安装Azure Module

    目前Linux版本的PowerShell还是Alpha版本,所以很多功能不能使用. 比如通过Powershell命令:install-module AzureRM在线安装Azure的Module.但我 ...

  9. 蓝桥杯 算法训练 ALGO-147 4-3水仙花数

    算法训练 4-3水仙花数   时间限制:1.0s   内存限制:256.0MB 问题描述 打印所有100至999之间的水仙花数.所谓水仙花数是指满足其各位数字立方和为该数字本身的整数,例如 153=1 ...

  10. SpringCloud组件的简单介绍

    springcloud官网springcloud中文网站 最近开始接触springcloud,所以先了解了一下最最基本概念. Spring Cloud ConfigSpring配置管理工具包,让你可以 ...