当前位置:   article > 正文

496.下一个更大的元素

496.下一个更大的元素

算法题

第一遍:1.看5分钟,没思路看题解

2.通过题解改进自己的解法,并且要写每行的注释以及自己的思路。

3.思考自己做到了题解的哪一步,下次怎么才能做对(总结方法)

4.整理到自己的自媒体平台。

5.再刷重复的类似的题目,根据时间和任务安排刷哪几个板块

6.用c++语言 都刷过一遍了 就刷中等

一.题目

nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。

给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。

对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j] 的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1 。

返回一个长度为 nums1.length 的数组 ans 作为答案,满足 ans[i] 是如上所述的 下一个更大元素 。

示例 1:

输入:nums1 = [4,1,2], nums2 = [1,3,4,2].
输出:[-1,3,-1]
解释:nums1 中每个值的下一个更大元素如下所述:
- 4 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。
- 1 ,用加粗斜体标识,nums2 = [1,3,4,2]。下一个更大元素是 3 。
- 2 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。

示例 2:

输入:nums1 = [2,4], nums2 = [1,2,3,4].
输出:[3,-1]
解释:nums1 中每个值的下一个更大元素如下所述:
- 2 ,用加粗斜体标识,nums2 = [1,2,3,4]。下一个更大元素是 3 。
- 4 ,用加粗斜体标识,nums2 = [1,2,3,4]。不存在下一个更大元素,所以答案是 -1 。

提示:

  • 1 <= nums1.length <= nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 104
  • nums1nums2中所有整数 互不相同
  • nums1 中的所有整数同样出现在 nums2 中

进阶:你可以设计一个时间复杂度为 O(nums1.length + nums2.length) 的解决方案吗?

二、反思

1.自己的解法

  1. class Solution {
  2. public:
  3. vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
  4. int m = nums1.size();
  5. int n = nums2.size();
  6. vector<int> res(m);
  7. for (int i = 0; i < m; ++i) {
  8. int j = 0;
  9. while (j < n && nums2[j] != nums1[i]) {
  10. ++j;
  11. }
  12. int k = j + 1;
  13. while (k < n && nums2[k] < nums2[j]) {
  14. ++k;
  15. }
  16. res[i] = k < n ? nums2[k] : -1;
  17. }
  18. return res;
  19. }
  20. };
  21. 作者:力扣官方题解
  22. 链接:https://leetcode.cn/problems/next-greater-element-i/solutions/1065517/xia-yi-ge-geng-da-yuan-su-i-by-leetcode-bfcoj/
  23. 来源:力扣(LeetCode)
  24. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2.题目的解法 

  1. class Solution {
  2. public:
  3. vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
  4. unordered_map<int,int> hashmap;//记录了nums2【i】的右边第一个大于本身的值
  5. stack<int> st;
  6. for (int i = nums2.size() - 1; i >= 0; --i) {
  7. int num = nums2[i];
  8. while (!st.empty() && num >= st.top()) {//保证在栈顶每次都能找到最大的第一个值。
  9. st.pop();
  10. }
  11. hashmap[num] = st.empty() ? -1 : st.top();//这个代码块的作用是找到i右边最小或者最大值
  12. st.push(num);//用于更新栈顶,如果比左边的值小,就会被弹走
  13. }
  14. vector<int> res(nums1.size());
  15. for (int i = 0; i < nums1.size(); ++i) {
  16. res[i] = hashmap[nums1[i]];
  17. }
  18. return res;
  19. }
  20. };
  21. 作者:力扣官方题解
  22. 链接:https://leetcode.cn/problems/next-greater-element-i/solutions/1065517/xia-yi-ge-geng-da-yuan-su-i-by-leetcode-bfcoj/
  23. 来源:力扣(LeetCode)
  24. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 3.思路的异同

三.进步的地方

单调栈还是很有说法的啊。 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/616293
推荐阅读
相关标签
  

闽ICP备14008679号