LeetCode第496题:下一个更大元素 I
问题描述
给定两个没有重复元素的数组 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
参考资料
LeetCode第496题:下一个更大元素 I的更多相关文章
- LeetCode 496. 下一个更大元素 I(Next Greater Element I) 35
496. 下一个更大元素 I 496. Next Greater Element I 题目描述 给定两个没有重复元素的数组 nums1 和 nums2,其中 nums1 是 nums2 的子集.找到 ...
- Leetcode 496. 下一个更大元素 I
1.题目描述 给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nums1 中数字 ...
- Java实现 LeetCode 496 下一个更大元素 I
496. 下一个更大元素 I 给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nu ...
- 【LeetCode】496.下一个更大元素I
496.下一个更大元素I 知识点:栈:HashMap: 题目描述 给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集. 请你找出 nums1 中每个元 ...
- Leetcode---栈系列刷题(python3实现)----#496 下一个更大元素I
给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nums1 中数字 x 的下一个更 ...
- LeetCode:下一个更大元素I【31】
LeetCode:下一个更大元素I[31] 题目描述 给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的 ...
- LeetCode 556. 下一个更大元素 III(Next Greater Element III)
556. 下一个更大元素 III 556. Next Greater Element III 题目描述 给定一个 32 位正整数 n,你需要找到最小的 32 位整数,其与 n 中存在的位数完全相同,并 ...
- LeetCode 503. 下一个更大元素 II(Next Greater Element II)
503. 下一个更大元素 II 503. Next Greater Element II 题目描述 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 ...
- [Leetcode]下一个更大元素II
题目 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地 ...
随机推荐
- Java演示手机发送短信验证码功能实现
我们这里采用阿里大于的短信API 第一步:登陆阿里大于,下载阿里大于的SDK a.在阿里大于上创建自己的应用 b.点击配置管理中的验证码,先添加签名,再配置短信模板 第二步:解压相关SDK,第一个为j ...
- 《Javascript高级程序设计》阅读记录(三):第五章 上
这个系列以往文字地址: <Javascript高级程序设计>阅读记录(一):第二.三章 <Javascript高级程序设计>阅读记录(二):第四章 这个系列,我会把阅读< ...
- nodejs 接口跨域
//设置跨域访问 //设置跨域访问 app.all('*', function(req, res, next) { res.header("Access-Control-Allow-Orig ...
- git之clone
git clone 命令参数: usage: git clone [options] [--] <repo> [<dir>] -v, --verbose be more ver ...
- DCloud-wap2app:杂项
ylbtech-DCloud-wap2app:杂项 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 7.返回顶部 8.返回顶部 ...
- 找不到引用microsoft.office.core解决办法 via mrcjiong
在控制面板中,选择"添加删除程序",找到office ,选择"更改",在对话框中选择"添加删除功能",然后选择自定义安装,添加上office ...
- 手机定位室内gps没信号
手机定位一般分3种,gps,手机信号基站,上网地点,其中gps信号一般只有户外有,所以在室外的时候只开启定位和gps就可以定位了,但是在室内没有gps的情况,就需要开网络定位了.
- CTF中常见文件的文件头(十六进制)
jpg/jpeg FF D8 FF E0 或 FF D8 FF E1 或 FF D8 FF E8 png 89 50 4E 47 bmp 42 4D 36 5D gif 47 49 46 38 zip ...
- 2015.3.12Arinc424 Tools中SiniArincCls.csParserFile(string sFile)函数正则表达式理解
原文: string RegEx1 = @"(\[ITEM\]\s*=[\S\s]*?(?=\[ITEM\])|\[ITEM\]\s*=[\S\s]*)";//用来识别主记录和后续 ...
- 第十三章 Spring框架的设计理念与设计模式分析(待续)
Spring的骨骼架构 核心组件详解 Spring中AOP的特性详解 设计模式解析之代理模式 设计模式解析之策略模式