• 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. };

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

  • 相关阅读:
    应用软件安全编程--18预防存储型 XSS
    Arduino驱动BMA220三轴加速度传感器(惯性测量传感器篇)
    类型体系与基本数据类型(第一节)
    循迹模式——红外循迹模块使用介绍
    软件测试怎么去介绍一个项目的测试流程?
    RocketMQ源码分析:延迟消息
    Qt 创建包含多个项目的工程以及各项目之间的调用
    Python算法100例-1.10 数制转换
    接口自动化测试框架(pytest+allure+aiohttp+ 用例自动生成)
    D. AND, OR and square sum(二进制位+贪心)
  • 原文地址:https://blog.csdn.net/qq_63098229/article/details/133965898