leetcode
来源:互联网 发布:vb.net 控件数组 编辑:程序博客网 时间:2024/06/04 23:50
ou are given two arrays (without duplicates) nums1
and nums2
where nums1
’s elements are subset of nums2
. Find all the next greater numbers for nums1
's elements in the corresponding places of nums2
.
The Next Greater Number of a number x in nums1
is the first greater number to its right in nums2
. If it does not exist, output -1 for this number.
Example 1:
Input: nums1 = [4,1,2], nums2 = [1,3,4,2].Output: [-1,3,-1]Explanation: For number 4 in the first array, you cannot find the next greater number for it in the second array, so output -1. For number 1 in the first array, the next greater number for it in the second array is 3. For number 2 in the first array, there is no next greater number for it in the second array, so output -1.
Example 2:
Input: nums1 = [2,4], nums2 = [1,2,3,4].Output: [3,-1]Explanation: For number 2 in the first array, the next greater number for it in the second array is 3. For number 4 in the first array, there is no next greater number for it in the second array, so output -1.
Note:
- All elements in
nums1
andnums2
are unique. - The length of both
nums1
andnums2
would not exceed 1000.
题目大意:给两个数组findNums和nums,返回一个和findNums等长的数组,其返回的内容为:对于findNums[i],返回的result[i]为nums[i]数组中,findNums[i]的后面的元素中第一个比findNums[i]大的元素。如果不存在这样的元素就写-1。其中findNums数组是nums数组的子数组
MySolution:
大致思路:从后面往前面遍历nums,建立关系map<nums元素,往右第一个比nums大的元素>relation,之后findnums直接访问这个map即可。
考虑nums[i] + nums[i+1],relation[nums[i+1]] 为val
1.if(nums[i] < nums[i+1]) 则relation[nums[i]]应该为nums[i+1]
2.if(nums[i] > nums[i+1] &&-1==val) 没有比nums[i+1]更大的数,自然没有比nums[i]更大的数,所以为-1
3.if(nums[i] > nums[i+1] &&-1!=val&&val<nums[i]) val比nums[i+1]大,但不一定比nums[i]大,所以用val取代nums[i+1]一直找,直到找到符合1或2
4.if(nums[i] > nums[i+1] &&-1!=val&&val>nums[i]) 显然 relation[nums[i]]应该为val
class Solution {
public: vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) { vector<int> temp; map<int,int> relation; int m = findNums.size(); int n = nums.size(); if(n==0) return temp; relation[nums[n-1]] = -1; for (int i = n - 2; i >= 0; --i) { if (nums[i] < nums[i+1]) relation[nums[i]] = nums[i+1]; else { int val = relation[nums[i+1]]; if (-1 == val) relation[nums[i]] = -1; else { while (-1 != val) { if (val > nums[i]) break; val = relation[val]; } relation[nums[i]] = val; } } } for (int i = 0; i < m ; ++i) { temp.push_back(relation[findNums[i]]); }
return temp;
}};
网上看到的其他做法,比较简洁:(csdn liuchuo)
分析:(设栈顶的元素A,那么栈里面比A小的都没有搜索价值了,直接出栈)使用栈,从后往前遍历nums[i],每当栈不为空的时候,一直出栈直到遇到比nums[i]大的数字停止。设立一个map<int, int> m,存储nums中每一个元素以及它对应的下一个最大元素构成的映射。如果停止后栈为空就将m[nums[i]]标记为-1,否则就写栈的栈顶元素~
最后将findNums中出现的每一个元素对应的map的值放入result数组中返回~
最后将findNums中出现的每一个元素对应的map的值放入result数组中返回~
class Solution {
public: vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) { vector<int> result; stack<int> s; map<int, int> m; for (int i = nums.size() - 1; i >= 0; i--) { while (!s.empty() && s.top() <= nums[i]) s.pop(); m[nums[i]] = s.empty() ? -1 : s.top(); s.push(nums[i]); } for (int i = 0; i < findNums.size(); i++) result.push_back(m[findNums[i]]); return result; }};
0 0
- leetcode
- [leetcode]
- LeetCode
- leetcode
- leetcode
- leetcode:
- leetcode:
- LeetCode
- leetcode
- LEETCODE
- leetcode
- leetCode
- leetcode
- [leetcode]
- LeetCode
- leetcode
- leetcode:
- leetcode
- 20170224
- 《Head first设计模式》学习笔记 – 工厂方法模式
- 解决Eclipse Access restriction问题
- 面试算法:计算堆栈当前元素的最大值
- mycat+mysql 报错com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: partition table, insert mus
- leetcode
- Linux系统磁盘空间无故占满解决方法
- 【网络编程】Trojan源码 文件传输+远程cmd+键盘记录
- 重磅!神经网络浅讲:从神经元到深度学习
- 工作流学习——重要概念扫盲篇一步曲
- 关于寻路算法的一些思考(3):A*算法的实现
- 什么是死锁
- 关于javascript闭包的理解
- 看过这两张图,就明白 Buffer 和 Cache 之间区别