【代码随想录】刷题Day58

1.每日温度

739. 每日温度

自己写的思路

1.由于前面的数是需要后面的第一个比当前值要大的数,所以我思考的顺序是先后面再前面

2.由于其找的都是大的值,如果碰到比当前位置小一点的值也是难免的。那么我们需要做的就是记录。不过这时我们需要的是stack的结构,因为对于当前值已经很大的值,可能对于下一个位置就不是那么大了,所以我们还需要找曾经存储过的值来进行比较,那先进后出就符合stack的结构。

3.栈中存储的就是较大值的下标。

4.出入栈的思路就是根据所谓遇到的当前值和栈顶值的比较,那情况就只有三种:大小等于。我们需要逐个分析。

如果当前位置的值小于栈顶的值,那么此时直接入距离差就行,answer[i] = s.top() - i;

如果当前位置的值大于栈顶的值,此时其实不是我们需要的值,我们需要将它pop掉,为什么这样做?第一作为当前值大于栈顶的值就不符合条件,第二作为下一个值,下一个值如果小于当前值那么下一个值就直接求距离了,如果下一个值大于当前值,那么怎么可能还轮得到现在这个栈顶比当前值还小的值来判断。所以自然需要出栈。

那么根据条件;如果相同值,我们不会作为判断,所以也是直接出栈

5.最后将当前值位置入栈

class Solution {
public:
    vector dailyTemperatures(vector& temperatures) {
        vectoranswer(temperatures.size(), 0);
        stacks;
        s.push(answer.size() - 1);
        for (int i = answer.size() - 2; i >= 0; i--)
        {
            while (s.size() != 0 && temperatures[i] >= temperatures[s.top()])
                s.pop();
            if (s.size() != 0)
                answer[i] = s.top() - i;
            s.push(i);
        }
        return answer;
    }
};

1.这个思路是正序的,其实思路也是当前的值和栈顶的值进行比较。只不过这个栈会存储每一个值,适当的时候进行修改

2.出入栈的思路跟上面一样,都是讨论当前值和栈顶值的比较

如果没有值直接push当前值

如果当前值大于栈顶的值,说明此时栈顶的值是可以被算出差值的,那么通过栈顶的属性找到当前可以被得到结果的栈顶对于位置的answer进行处理,answer[s.top()] = i - s.top();随后由于已经被处理过了,那么该栈顶所在位置不需要再存在了,直接出栈

当前位置的值下标也要被得到结果,所以也被push到栈中,等待下一次的更新

class Solution {
public:
    vector dailyTemperatures(vector& temperatures) {
        vectoranswer(temperatures.size(), 0);
        stacks;
        for (int i = 0; i < answer.size(); i++)
        {
            while (s.size() != 0 && temperatures[i] > temperatures[s.top()])
            {
                answer[s.top()] = i - s.top();
                s.pop();
            }
            s.push(i);
        }
        return answer;
    }
};

2.下一个更大元素 I

496. 下一个更大元素 I

1.其实就是复用上面的距离,不过我在此上做了变化,此时求的不是距离差,而是直接指向的下标,这样对于下面的找到更大元素可以直接通过下标访问。

2.由于数组是不会出现重复的数字的,并且对于我们而言还得找两个数组的重叠数,此时hash表可再适合不过了。所以我们定义了一个unordered_map用来记录第二个数组出现过的数字和它对应的下一个更大元素的下标

3.进入循环中,如果找不到公共元素的下一个更大元素,直接ret[i]=-1;;如果能找到,那么我们更新为unordered_map的second所指下标的vector中的元素值:ret[i]=nums2[m.find(nums1[i])->second];

class Solution {
public:
    vector dailyTemperatures(vector& nums2) {
        vectoranswer(nums2.size(), -1);
        stacks;
        for (int i = 0; i < answer.size(); i++)
        {
            while (s.size() != 0 && nums2[i] > nums2[s.top()])
            {
                answer[s.top()] = i;
                s.pop();
            }
            s.push(i);
        }
        return answer;
    }

    vector nextGreaterElement(vector& nums1, vector& nums2) {
        vectoranswer=dailyTemperatures(nums2);
        vectorret(nums1.size(),0);
        unordered_mapm;
        for(int i=0;isecond==-1)
                ret[i]=-1;
            else
            {
                ret[i]=nums2[m.find(nums1[i])->second];
            }
        }
        return ret;
    }
};

你可能感兴趣的:(算法,c++,开发语言,leetcode,动态规划)