这个题做起来相对有意思一些。这是一个用于找规律的题。
题目大意是,给两个数组nums1和nums2,其中nums1
的元素均是nums2里面的子元素,问nums1中元素右边最大的元素是谁,如果没有则返回-1。
这个题的思路就是:
- 把nums2拆分为若干递减再递增的列表。然后依次push到HashMap中。
- 遍历nums1,获取HashMap中的value值
例:
假定num2中的元素为[1,3,4,2] ->就可以拆分为 [1, 3, 4]、[4]、[2]这样的三个子序列。
对应塞入的HashMap里面的内容就为
(1, 4), (3, 4), (4, -1), (2, -1)。 (注:实现的时候有所区别)
假定num1中的元素为[4,1,2],根据key值获取对应的value。对应的就是[-1, 4, -1]了。
/**
* Created by Joe on 2017/12/18.
* https://leetcode.com/problems/next-greater-element-i/description/
*/
public class P496 {
public int[] nextGreaterElement(int[] findNums, int[] nums) {
Map<Integer, Integer> map = new HashMap<>(); // map from x to next greater element of x
Stack<Integer> stack = new Stack<>();
for (int num : nums) {
while (!stack.isEmpty() && stack.peek() < num)
map.put(stack.pop(), num);
stack.push(num);
}
for (int i = 0; i < findNums.length; i++)
findNums[i] = map.getOrDefault(findNums[i], -1);
return findNums;
}
}