[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 ...
随机推荐
- 不重启修改'log_slave_updates'变量
Variable 'log_slave_updates' is a read only variable 不重启修改mysql变量 执行复制的时候遇到的问题 mysql> show variab ...
- 显式锁(二)Lock接口与显示锁介绍
一.显式锁简介 显式锁,这个叫法是相对于隐式锁synchronized而言的,加锁和解锁都要用户显式地控制.显示锁Lock是在Java5中添加到jdk的,同synchronized一样,这也是一 ...
- Python小代码
from bs4 import BeautifulSoup import requests url = 'http://www.tripadvisor.cn/Attractions-g60763-Ac ...
- 微信通过openID发送消息/后台post、get提交并接收数据
控制器:下面是post发送消息(微信不支持从前台发送数据,之前试过,报错,需要跨域,跨域的问题解决后还不行,最后发现之后后端提交 WXApi类: #region 验证Token是否过期 /// < ...
- JPQL和SQL的比较
前言 在JAVA EE中,JPQL是专门为Java 应用程序访问和导航实体实例设计的.Java Presistence Query Language(JPQL),java持久性查询语言.它是JPA规范 ...
- Yii2 基础学习
<?php //url创建 echo Url::to(''); // same controller, different action // /index.php?r=management/d ...
- S+ hidden tray with window start
官方论坛上有个帖子给出了答案: I forgot that this is supported in the code, but it requires a little editing of the ...
- hibernate-list
Hibernate多表关联查询类: 1. sql查询两个或两个以上的字段,默认情况下,list中封装的是Object[],长度与所查询的字段数一致.这种方式获取的数据只能通过index下标获取. su ...
- 8 python 抽象类
1.抽象类 --类似接口 接口的概念: 自己提供给使用者来调用自己功能的方式\方法\入口, 1.1.java中接口 interface =================第一部分:Java 语言中的 ...
- shell中的条件判断以及与python中的对比
shell中比如比较字符串.判断文件是否存在及是否可读等,通常用"[]"来表示条件测试. 注意:这里的空格很重要.要确保方括号的空格. if ....; then ...