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:

  1. Input: nums1 = [4,1,2], nums2 = [1,3,4,2].
  2. Output: [-1,3,-1]
  3. Explanation:
  4. For number 4 in the first array, you cannot find the next greater number for it in the second array, so output -1.
  5. For number 1 in the first array, the next greater number for it in the second array is 3.
  6. For number 2 in the first array, there is no next greater number for it in the second array, so output -1. 

Example 2:

  1. Input: nums1 = [2,4], nums2 = [1,2,3,4].
  2. Output: [3,-1]
  3. Explanation:
  4. For number 2 in the first array, the next greater number for it in the second array is 3.
  5. For number 4 in the first array, there is no next greater number for it in the second array, so output -1.

Note:

  1. All elements in nums1 and nums2 are unique.
  2. The length of both nums1 and nums2 would not exceed 1000.

给2个没有重复元素的数组nums1, nums2,nums1的元素是由nums2的子集组成,求nums1中每个数字在nums2右边第一个较大的数字,如果不存在则为-1。返回所找到的结果组成的数组。

Key observation:
Suppose we have a decreasing sequence followed by a greater number
For example [5, 4, 3, 2, 1, 6] then the greater number 6 is the next greater element for all previous numbers in the sequence

We use a stack to keep a decreasing sub-sequence, whenever we see a number x greater than stack.peek() we pop all elements less than x and for all the popped ones, their next greater element is x
For example [9, 8, 7, 3, 2, 1, 6]
The stack will first contain [9, 8, 7, 3, 2, 1] and then we see 6 which is greater than 1 so we pop 1 2 3 whose next greater element should be 6

解法:栈,递减栈。先求出nums2中所有元素的右边第一个较大数字的位置,并记录到map中。然后,因为nums1是子数组,循环nums1中的元素,记录在map中值并返回。求nums2中下一个较大元素时用递减栈,循环元素,当前元素大于栈顶元素时,就弹出栈顶元素,并记录栈顶元素下一个最大就是当前元素。然后继续比较栈顶元素,直到小于或等于栈顶元素。

G家followup: 如果data是stream data怎么改代码和设计输出。

Java:

  1. public int[] nextGreaterElement(int[] findNums, int[] nums) {
  2. Map<Integer, Integer> map = new HashMap<>(); // map from x to next greater element of x
  3. Stack<Integer> stack = new Stack<>();
  4. for (int num : nums) {
  5. while (!stack.isEmpty() && stack.peek() < num)
  6. map.put(stack.pop(), num);
  7. stack.push(num);
  8. }
  9. for (int i = 0; i < findNums.length; i++)
  10. findNums[i] = map.getOrDefault(findNums[i], -1);
  11. return findNums;
  12. }

Python:

  1. class Solution(object):
  2. def nextGreaterElement(self, findNums, nums):
  3. """
  4. :type findNums: List[int]
  5. :type nums: List[int]
  6. :rtype: List[int]
  7. """
  8. d = {}
  9. st = []
  10. ans = []
  11.  
  12. for x in nums:
  13. while len(st) and st[-1] < x:
  14. d[st.pop()] = x
  15. st.append(x)
  16.  
  17. for x in findNums:
  18. ans.append(d.get(x, -1))
  19.  
  20. return ans

Python: wo

  1. class Solution(object):
  2. def nextGreaterElement(self, findNums, nums):
  3. """
  4. :type findNums: List[int]
  5. :type nums: List[int]
  6. :rtype: List[int]
  7. """
  8. if not findNums or not nums:
  9. return []
  10.  
  11. m = {}
  12. for i in range(len(nums) - 1):
  13. for j in range(i + 1, len(nums)):
  14. if nums[j] > nums[i]:
  15. m[nums[i]] = nums[j]
  16. break
  17. if not m.get(nums[i], 0):
  18. m[nums[i]] = -1
  19.  
  20. m[nums[-1]] = -1
  21.  
  22. res = []
  23. for num in findNums:
  24. res.append(m[num])
  25.  
  26. return res   

C++:  

  1. class Solution {
  2. public:
  3. vector<int> nextGreaterElement(vector<int>& findNums, vector<int>& nums) {
  4. stack<int> s;
  5. unordered_map<int, int> m;
  6. for (int n : nums) {
  7. while (s.size() && s.top() < n) {
  8. m[s.top()] = n;
  9. s.pop();
  10. }
  11. s.push(n);
  12. }
  13. vector<int> ans;
  14. for (int n : findNums) ans.push_back(m.count(n) ? m[n] : -1);
  15. return ans;
  16. }
  17. };

  

类似题目:

[LeetCode] 503. Next Greater Element II 下一个较大的元素 II

[LeetCode] 556. Next Greater Element III 下一个较大的元素 III

[LeetCode] 739. Daily Temperatures 每日温度

  

All LeetCode Questions List 题目汇总

[LeetCode] 496. Next Greater Element I 下一个较大的元素 I的更多相关文章

  1. [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 ...

  2. [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 ...

  3. [leetcode]496. Next Greater Element I下一个较大元素

    You are given two arrays (without duplicates) nums1 and nums2 where nums1’s elements are subset of n ...

  4. [LeetCode] Next Greater Element II 下一个较大的元素之二

    Given a circular array (the next element of the last element is the first element of the array), pri ...

  5. 496 Next Greater Element I 下一个更大元素 I

    给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值.nums1 中数字 x 的下一个更大 ...

  6. Leetcode496.Next Greater Element I下一个更大的元素1

    给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nums1 中数字 x 的下一个更 ...

  7. 503 Next Greater Element II 下一个更大元素 II

    给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它 ...

  8. [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 ...

  9. [LeetCode] Next Greater Element I 下一个较大的元素之一

    You are given two arrays (without duplicates) nums1 and nums2 where nums1’s elements are subset of n ...

随机推荐

  1. python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'的解决方法:

    全文转载至:http://www.cnblogs.com/testyao/p/5658200.html python3中用HTMLTestRunner.py报ImportError: No modul ...

  2. http消息与webservice

    别人的:在一台配置较低的PC上,同时开启服务端与客户端,10000条数据,使用基于http的消息逐条进行传递,从开始传递至全部接收并处理完毕,大概需要465秒的时间:而在同一台机器上,使用WebSer ...

  3. 项目Alpha冲刺(团队)-总结篇

    格式描述 课程名称:软件工程1916|W(福州大学) 作业要求:项目Alpha冲刺(团队)-代码规范.冲刺任务与计划 团队名称:为了交项目干杯 作业目标:描述项目预期计划.现实进展.过程体会.组员分工 ...

  4. ZOJ - 3157:Weapon (几何 逆序对)

    pro:给定平面上N条直线,保证没有直线和Y轴平行. 求有多少交点的X坐标落在(L,R)开区间之间,注意在x=L或者R处的不算. sol:求出每条直线与L和R的交点,如果A直线和B直线在(L,R)相交 ...

  5. 使用Patroni和HAProxy创建高可用的PostgreSQL集群

    操作系统:CentOS Linux release 7.6.1810 (Core) node1:192.168.216.130 master node2:192.168.216.132 slave n ...

  6. 牛客小白月赛12 H 华华和月月种树

    题目链接: 题意:有三个操作 操作 1:表示节点 i 长出了一个新的儿子节点,权值为0,编号为当前最大编号 +1(也可以理解为,当前是第几个操作 1,新节点的编号就是多少). 操作 2:表示华华上线做 ...

  7. idea中properties配置文件 注释显示中文乱码问题

  8. web开发——文件的上传和下载

    众所皆知,web上传大文件,一直是一个痛.上传文件大小限制,页面响应时间超时.这些都是web开发所必须直面的. 本文给出的解决方案是:前端实现数据流分片长传,后面接收完毕后合并文件的思路. 实现文件夹 ...

  9. canvas的基本使用

    一.定义 canvas最早是由Apple引入Webkit的,<canvas>元素包含于HTML5中 HTML5的canvas元素使用JavaScript在网页上绘制图像,画布是一个矩形区域 ...

  10. Dense Semantic Labeling with Atrous Spatial Pyramid Pooling and Decoder for High-Resolution Remote Sensing Imagery(高分辨率语义分割)

    对 Potsdam and Vaihingen 公开数据集进行处理,得到了SOTA的结果,超越DeepLab_v3+,提出的网络结构如下:结合了ASPP和FCN,UNet