[leetcode]496. Next Greater Element I下一个较大元素
You 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.
题意:
给定数组nums, 又给定它的子集subNums, 求subNums中每个元素在nums中右边第一个较大元素(即Next Greater Element)
subNums = [,1,2] 当扫到元素4, 该元素在 nums = [1,3,,2] 中右边第一个数为2, 并不greater than 4, 返回-1
subNums = [4,,2] 当扫到元素1, 该元素在 nums = [,3,4,2] 中右边第一个数为3, 确实greater than 1, 返回 3
subNums = [4,1,] 当扫到元素2, 该元素在 nums = [1,3,4,] 中右边没有元素, 不存在greater than 2, 返回-1
思路:
两个指针同时扫 subNums 和 nums
用一个boolean变量做标记,若当前 subNums 元素等于当前nums元素,则标记 found = true ,说明找到了corresponding元素。
nums指针继续往右,找greater element, 直到找到符合 found && nums[j] > subNums[i] 条件的元素。否则返回-1
代码一:
 class Solution {
      public int[] nextGreaterElement(int[] subNums, int[] nums) {
         int[] res = new int[subNums.length];
         for (int i = 0; i < subNums.length; i++) {
             boolean found = false;
             int j = 0;
             for (; j < nums.length; j++) {
                 if (found && nums[j] > subNums[i]) {
                     res[i] = nums[j];
                     break;
                 }
                 if (found && nums[j] < subNums[i]) {
                     res[i] = -1;
                 }
                 if (nums[j] == subNums[i]) {
                     found = true;
                 }
             }
             if (j == nums.length) {
                 res[i] = -1;
             }
         }
         return res;
     }
 }
另外一个思路就是用单调栈 + HashMap
为何用单调栈? 为任意一个元素找左边和右边第一个比自己大/小的位置,用单调栈。
先只take care of nums : 从右往左扫nums, 用Stack维护递减栈,留下波峰,剔除波谷。比较栈顶元素跟即将入栈元素大小,
用HashMap来记录其比较结果。再take care of nums: 扫一遍subNums,在HashMap中找到对应的value,返回即可。
subNums = [4,1,2], nums = [1,0,3,4,2]
Stack HashMap
^ [2] 2 | -1
^ [4] 4 | -1
^ [4, 3] 3 | 4
^ [4, 3, 0] 0 | 3
^ [4, 3, 1] 1 | 3
代码二:
  public int[] nextGreaterElement(int[] subNums, int[] nums) {
         int[] res = new int[subNums.length];
         Stack<Integer> stack = new Stack<>();
         HashMap<Integer, Integer> map = new HashMap<>();
         for (int i = nums.length - 1; i >= 0; i--) {
             while (!stack.empty() && nums[i] > stack.peek()) {
                 stack.pop();
             }
             if (stack.empty()) {
                 map.put(nums[i], -1);
             } else {
                 map.put(nums[i], stack.peek());
             }
             stack.push(nums[i]);
         }
         for (int i = 0; i < subNums.length; i++) {
             res[i] = map.get(subNums[i]);
         }
         return res;
     }
[leetcode]496. Next Greater Element I下一个较大元素的更多相关文章
- [LeetCode] 496. Next Greater Element I 下一个较大的元素 I
		
You are given two arrays (without duplicates) nums1 and nums2 where nums1’s elements are subset of n ...
 - 496 Next Greater Element I 下一个更大元素 I
		
给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值.nums1 中数字 x 的下一个更大 ...
 - [LeetCode] 503. Next Greater Element II 下一个较大的元素 II
		
Given a circular array (the next element of the last element is the first element of the array), pri ...
 - [LeetCode] 556. Next Greater Element III 下一个较大的元素 III
		
Given a positive 32-bit integer n, you need to find the smallest 32-bit integer which has exactly th ...
 - 503 Next Greater Element II 下一个更大元素 II
		
给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它 ...
 - Leetcode496.Next Greater Element I下一个更大的元素1
		
给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nums1 中数字 x 的下一个更 ...
 - [LeetCode] Next Greater Element II 下一个较大的元素之二
		
Given a circular array (the next element of the last element is the first element of the array), pri ...
 - [LeetCode] Next Greater Element III 下一个较大的元素之三
		
Given a positive 32-bit integer n, you need to find the smallest 32-bit integer which has exactly th ...
 - [LeetCode] Next Greater Element I 下一个较大的元素之一
		
You are given two arrays (without duplicates) nums1 and nums2 where nums1’s elements are subset of n ...
 
随机推荐
- 自己写的jQuery放大镜插件效果(一)(采用一张大图和一张小图片的思路)
			
这个思路的方法会带来一个小问题,就是当鼠标放到小图上去时,会开始加载大图片,网速不佳的时候,会出现加载慢的情况.但是放大的效果和你所给出的大图片的清晰度是一样的. 先看效果图: html代码: < ...
 - Web Api in Orchard
			
Web Api in Orchard Web Api is available in Orchard. You can implement a web api to fit your needs in ...
 - 洛谷:P1087 FBI树   P1030 求先序排列  P1305 新二叉树
			
至于为啥把这三个题放到一起,大概是因为洛谷的试炼场吧,三道树的水题,首先要理解 先序中序后序遍历方法. fbi树由于数量小,在递归每个区间时,暴力跑一遍区间里的数,看看是否有0和1.至于递归的方法,二 ...
 - IntelliJ IDEA创建maven web项目(IDEA新手适用)
			
步骤一:首先先创建一个project,在这里就是创建一个maven的工作空间 步骤二:按照下面的步骤操作就可以了,最后next 首先,选择左边的maven 然后在右边Creater from ar ...
 - tornado-简单的服务器
			
安装tornado pip install tornado 安装sqlalchemy 1.大概代码的解释 import tornado.ioloop #开启循环,等待访问 import tornado ...
 - linux随机数
			
linux系统随机数生成;1,利用uuid(universally unique identifier),由open software foundation在distributed computing ...
 - HTML5 Canvas ( 图形的阴影 ) shadowColor, shadowOffsetX, shadowOffsetY, shadowNlur
			
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
 - eclipse 的project explorer问题,这个怎样把localFileSystem去掉
			
转自:https://zhidao.baidu.com/question/550279043.html
 - Django中使用Celery实现定时任务(用djcelery)
			
一.引言 Django是python语言下的一个比较热门的Web框架,越来越多的企业和开发者使用Django实现自己的Web服务器.在Web服务器开发过程中,有时候我们不仅仅是要实现Web服务器端和用 ...
 - fb  更新sdk
			
flash兼容flex.fb的sdk,但fb不一定兼容flash的sdk,那么直接将flash的sdk解压覆盖掉fb的sdk,就可以打开了. fb更新sdk方法: 1.找到(安装目录+eclipse\ ...