day61|739. 每日温度 ● 496.下一个更大元素 I

739. 每日温度

通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了

1.代码

暴力做法

class Solution {
public:
    vector dailyTemperatures(vector& temperatures) {
        int len = temperatures.size();
        vectorresult;
        for (int i = 0; i < len; i++) {
            int flag = 0;
            for (int j = i + 1; j < len; j++) {
                if (temperatures[j] > temperatures[i]) {
                    flag++;
                    break;
                }
                if (temperatures[j] <= temperatures[i] && j != len - 1) flag++;
                if (temperatures[j] <= temperatures[i] && j == len - 1) flag = 0; 
            }
            result.push_back(flag);
        }   
        return result;
    }
};

单调栈

class Solution {
public:
    vector dailyTemperatures(vector& temperatures) {
        stackst;
        st.push(0);
        vectorresult(temperatures.size(), 0);
        for (int i = 1; i < temperatures.size(); i++) {
            if (temperatures[i] <= temperatures[st.top()]) {
                st.push(i);
            } else {
                while (!st.empty() && temperatures[i] > temperatures[st.top()]) {
                    result[st.top()] = i - st.top();
                    st.pop();
                }
                st.push(i);
          }
        }
        return result;
    }
};

496. 下一个更大元素 I

1.代码

class Solution {
public:
    vector nextGreaterElement(vector& nums1, vector& nums2) {
        stack st;
        vector result(nums1.size(), -1);
        if (nums1.size() == 0) return result;

        unordered_map umap; // key:下标元素,value:下标
        for (int i = 0; i < nums1.size(); i++) {
            umap[nums1[i]] = i;
        }
        st.push(0);
        for (int i = 1; i < nums2.size(); i++) {
            if (nums2[i] < nums2[st.top()]) {           // 情况一
                st.push(i);
            } else if (nums2[i] == nums2[st.top()]) {   // 情况二
                st.push(i);
            } else {                                    // 情况三
                while (!st.empty() && nums2[i] > nums2[st.top()]) {
                    if (umap.count(nums2[st.top()]) > 0) { // 看map里是否存在这个元素
                        int index = umap[nums2[st.top()]]; // 根据map找到nums2[st.top()] 在 nums1中的下标
                        result[index] = nums2[i];
                    }
                    st.pop();
                }
                st.push(i);
            }
        }
        return result;
    }
};
针对版本一,进行代码精简后,代码如下:

// 版本二
class Solution {
public:
    vector nextGreaterElement(vector& nums1, vector& nums2) {
        stack st;
        vector result(nums1.size(), -1);
        if (nums1.size() == 0) return result;

        unordered_map umap; // key:下标元素,value:下标
        for (int i = 0; i < nums1.size(); i++) {
            umap[nums1[i]] = i;
        }
        st.push(0);
        for (int i = 1; i < nums2.size(); i++) {
            while (!st.empty() && nums2[i] > nums2[st.top()]) {
                if (umap.count(nums2[st.top()]) > 0) { // 看map里是否存在这个元素
                    int index = umap[nums2[st.top()]]; // 根据map找到nums2[st.top()] 在 nums1中的下标
                    result[index] = nums2[i];
                }
                st.pop();
            }
            st.push(i);
        }
        return result;
    }
};

2.运用map找元素

你可能感兴趣的:(代码随想录一刷,leetcode,算法,数据结构,c++)