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

739. 每日温度

注意点:

  1. 注意当前遍历的元素T[i]大于栈顶元素T[st.top()]的情况时候,需要加上!st.empty()

  1. 结果初始化为0,最后如果没找到最大的直接就是0

class Solution {
public:
    vector dailyTemperatures(vector& temperatures) {
        stack st;
        // 结果初始化为0,最后如果没找到最大的直接就是0
        vector result(temperatures.size(), 0);
        st.push(0);
        for(int i = 1; i temperatures[st.top()] ) {
                    result[st.top()] = i-st.top();
                    st.pop();
                }
            }
            st.push(i);

        }
        return result;
    }
};
//精简后的代码,for循环从0开始,只保留了大于的情况
class Solution {
public:
    vector dailyTemperatures(vector& temperatures) {
        stack st;
        // 结果初始化为0,最后如果没找到最大的直接就是0
        vector result(temperatures.size(), 0);

        for(int i = 0; i temperatures[st.top()] ) {
                result[st.top()] = i-st.top();
                st.pop();
            }
            st.push(i);

        }
        return result;
    }
};

496. 下一个更大元素 I

注意点:

1.两个 没有重复元素 的数组 nums1 和 nums2,所以用一个map数组将nums1存储起来,将map数组中的数与nums2进行比对,如果相等进行操作

2.这个题是对nums2进行单调栈操作的,在while之后添加了一个if条件句进行判断,如果在nums1中找到了和nums2中一样的数,便将nums2[i]的数赋值给result[index]

3.while循环中包含st.pop(),while循环外包含st.push(i)---注意逻辑关系

class Solution {
public:
    vector nextGreaterElement(vector& nums1, vector& nums2) {
        vector result(nums1.size(), -1);

        unordered_map umap;
        for(int i = 0; i< nums1.size(); i++) {
            umap[nums1[i]] = i;
        }

        stack st;
        st.push(0);
        for(int i = 1; i= nums2[i]) st.push(i);
            else {
                while(!st.empty() && nums2[i] > nums2[st.top()]) {
                    if(umap.find(nums2[st.top()]) != umap.end()) {
                        int index = umap[nums2[st.top()]];
                        result[index] = nums2[i];
                    }
                    st.pop();
                }
                st.push(i);
            }
        }
        return result;
    }
};

你可能感兴趣的:(刷题,算法,leetcode,数据结构)