• leetcode 739. 每日温度、496. 下一个更大元素 I


    739. 每日温度

    给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。

    示例 1:

    输入: temperatures = [73,74,75,71,69,72,76,73]
    输出: [1,1,4,2,1,1,0,0]
    

    示例 2:

    输入: temperatures = [30,40,50,60]
    输出: [1,1,1,0]
    

    示例 3:

    输入: temperatures = [30,60,90]
    输出: [1,1,0]
    思路:

            /*

                定义一个栈和数组result

                单调栈首先存入数组的第一个下标,然后从第二个元素开始遍历数组,判断接下来遍历的元素和栈顶元素的关系,

                如果接下来遍历的元素小于或者等于栈顶元素,则把该元素存入栈,

                如果接下来遍历的元素大于栈顶元素,记录栈顶元素下标下的下标差,这是我们要求的。

                把栈顶元素弹出,此时我们需要一个while循环,进行对该元素和栈顶元素的比较,和上述过程一样。

            */

    代码:
    1. class Solution {
    2. public:
    3. vector<int> dailyTemperatures(vector<int>& temperatures) {
    4. /*
    5. 定义一个栈和数组result
    6. 单调栈首先存入数组的第一个下标,然后从第二个元素开始遍历数组,判断接下来遍历的元素和栈顶元素的关系,
    7. 如果接下来遍历的元素小于或者等于栈顶元素,则把该元素存入栈,
    8. 如果接下来遍历的元素大于栈顶元素,记录栈顶元素下标下的下标差,这是我们要求的。
    9. 把栈顶元素弹出,此时我们需要一个while循环,进行对该元素和栈顶元素的比较,和上述过程一样。
    10. */
    11. vector<int>result(temperatures.size(),0);
    12. stack<int>st;
    13. st.push(0);
    14. for(int i = 1;isize();i++){
    15. if(temperatures[i]top()])
    16. {
    17. st.push(i);
    18. }
    19. else if(temperatures[i]==temperatures[st.top()]){
    20. st.push(i);
    21. }
    22. else{
    23. while(!st.empty()&&temperatures[i]>temperatures[st.top()]){
    24. result[st.top()] = i-st.top();
    25. st.pop();
    26. }
    27. st.push(i);
    28. }
    29. }
    30. return result;
    31. }
    32. };

    496. 下一个更大元素 I

    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. class Solution {
    2. public:
    3. vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
    4. stack<int> st;
    5. vector<int> result(nums1.size(), -1);
    6. if (nums1.size() == 0) return result;
    7. unordered_map<int, int> umap; // key:下标元素,value:下标
    8. for (int i = 0; i < nums1.size(); i++) {
    9. umap[nums1[i]] = i;
    10. }
    11. st.push(0);
    12. for (int i = 1; i < nums2.size(); i++) {
    13. if (nums2[i] < nums2[st.top()]) { // 情况一
    14. st.push(i);
    15. } else if (nums2[i] == nums2[st.top()]) { // 情况二
    16. st.push(i);
    17. } else { // 情况三
    18. while (!st.empty() && nums2[i] > nums2[st.top()]) {
    19. if (umap.count(nums2[st.top()]) > 0) { // 看map里是否存在这个元素
    20. int index = umap[nums2[st.top()]]; // 根据map找到nums2[st.top()] 在 nums1中的下标
    21. result[index] = nums2[i];
    22. }
    23. st.pop();
    24. }
    25. st.push(i);
    26. }
    27. }
    28. return result;
    29. }
    30. };

    还有很多瑕疵,还需继续坚持!

  • 相关阅读:
    LinuxShell编程1———shell基础命令
    【ElasticSearch学习笔记】一、ES下载、安装、目录结构、root用户权限问题、kibana下载安装
    unity驱动3d模特跳舞 穿模问题 穿透
    python安装mysqldb报错
    SSD程序
    【HUST】网安纳米|2023年研究生纳米技术考试参考
    松江主机联网方案
    ros-noetic采集单目USB相机数据
    网安基础之python学习第一天
    JS/CSS 交互
  • 原文地址:https://blog.csdn.net/qq_63098229/article/details/133965898