力扣刷题记录(26)LeetCode:516、739、496

516. 最长回文子序列

力扣刷题记录(26)LeetCode:516、739、496_第1张图片

用dp[i][j]表示区间[j,i]内最长回文子序列的长度,j从i位置开始向前遍历。

1.当i==j时,dp[i][j]=1

2.当s[i]==s[j]时,dp[i][j]=dp[i-1][j+1]+2

3.当s[i]!=s[j]时,dp[i][j]=max(dp[i-1][j] , dp[i][j+1])

class Solution {
public:
    int longestPalindromeSubseq(string s) {
        vector> dp(s.size(),vector(s.size(),0));
        for(int i=0;i=0;j--)
            {
                if(i==j)    dp[i][j]=1;
                else if(s[i]==s[j]) dp[i][j]=dp[i-1][j+1]+2;
                else dp[i][j]=max(dp[i][j+1],dp[i-1][j]);
            }
        }
        return dp[s.size()-1][0];
    }
};

 739. 每日温度

力扣刷题记录(26)LeetCode:516、739、496_第2张图片

单调栈登场。

单调栈就是用栈来记录已经遍历过的数据的,记录的方式就是要求栈内的元素递增或递减。在本题中可以将索引放到栈中,这样方便计算天数,栈内单调递增的方式按照索引所对应的温度值。遍历温度时,拿当前温度与栈顶元素所对应的温度作比较,如果当前温度大于栈顶所对应的温度,栈顶元素的下一个更高温度就是当前元素了;如果当前元素小于等于栈顶元素,直接入栈。

class Solution {
public:
    vector dailyTemperatures(vector& temperatures) {
        stack sk;
        vector ans(temperatures.size(),0);
        sk.push(0);
        for(int i=1;itemperatures[sk.top()])
                {
                    ans[sk.top()]=i-sk.top();
                    sk.pop();
                }
                else
                {
                    sk.push(i);
                    break;
                }
            }
            sk.push(i);
        }
        return ans;
    }
};

 496. 下一个更大元素 I

力扣刷题记录(26)LeetCode:516、739、496_第3张图片

这题和每日温度类似,但比它要难一些。主要是在对nums2进行单调栈方法时要判断一下当前元素是否在nums1中, 只有在nums1中我们才去收集答案。所以需要将nums1存放在哈希表中,方便我们判断当前元素是否在nums1中。

class Solution {
public:
    vector nextGreaterElement(vector& nums1, vector& nums2) {
        stack sk;
        vector ans(nums1.size(),-1);
        unordered_map m;
        for(int i=0;isk.top())
                {
                    //判断元素是否在nums1中
                    if(m.contains(sk.top()))
                        ans[m[sk.top()]]=nums2[i];
                    sk.pop();
                }
                else    break;
            }
            sk.push(nums2[i]);
        }
        return ans;
    }
};

总结

单调栈问题实际上就是用栈来记录已经遍历过的数据,记录的规则就是要求元素单调递增或单调递减。

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