(58/60)每日温度、下一个更大元素Ⅰ

每日温度

leetcode:739. 每日温度

单调栈

思路

单调栈,存放元素下标。
遍历一遍,每个元素和栈顶元素比较:

<=栈顶元素,入栈

 >栈顶元素,result[st.top()] = i - st.top();弹出 继续,直到遍历结束或<=栈顶元素

代码实现

class Solution {
public:
/*
单调栈,存放元素下标
遍历一遍,每个元素和栈顶元素比较:
<=栈顶元素,入栈
 >栈顶元素,result[st.top()] = i - st.top();弹出 继续,直到遍历结束或<=栈顶元素
*/
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        stack<int> st;
        vector<int> result(temperatures.size(),0);
        st.push(0);
        for(int i = 0;i < temperatures.size();i++){
            while(!st.empty() && temperatures[i] > temperatures[st.top()]){
                result[st.top()] = i - st.top();
                st.pop();
            }
            st.push(i);
        }

        return result;
    }
};

下一个更大元素Ⅰ

leetcode:496. 下一个更大元素 I

暴力法

复杂度分析

时间复杂度:接近O(N^3)

空间复杂度:O(1)。没有额外空间

代码实现

class Solution {
public:
/*
遍历nums1,找到对应的nums2位置
在nums2里寻找右侧第一个最大元素
*/
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        vector<int> result(nums1.size(),-1);
        for(int i = 0;i < nums1.size();i++){
            for(int j = 0;j < nums2.size();j++){
                if(nums1[i] == nums2[j]){
                    for(int k = j+1;k < nums2.size();k++){
                        if(nums2[k] > nums2[j]){
                            result[i] = nums2[k];
                            break;
                        }
                    }
                }
            }
        }

        return result;
    }
};

单调栈

复杂度分析

时间复杂度:O(N)。

空间复杂度:O(N)。

代码实现

class Solution {
public:
/*
先建立映射map(nums1元素值->nums1元素下标) 这样就可以通过num2元素值找到nums1对应位置了
然后就是对nums2的单调栈找下一个更大元素
*/
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        stack<int> st;
        vector<int> result(nums1.size(),-1);
        unordered_map<int,int> map;
        // 建立映射
        for(int i = 0;i < nums1.size();i++){
            map[nums1[i]] = i;
        }
        
        st.push(0);  // stack放nums2下标
        for(int i = 1;i < nums2.size();i++){
            while(!st.empty() && nums2[i] > nums2[st.top()]){
                // 如果st.top()在nums1里,记录结果
                // 在top这个位置记录下一个元素值
                if(map.find(nums2[st.top()]) != map.end()){
                    result[map[nums2[st.top()]]] = nums2[i];
                }
                st.pop();
            }
            st.push(i);
        }

        return result;
    }
};
posted @ 2024-03-28 17:05  Tazdingo  阅读(33)  评论(0)    收藏  举报