3. 无重复字符的最长子串 - 力扣(LeetCode)
双指针,l和r从字符串最左边开始,保存l和r之间的所有字符
移动r,若新加入的字符和已有字符重复,则不断移动l,直到l和r之间不出现重复字符
注意:移动的过程中需要维护l和r之间的字符
每次移动完r并保证l和r之间无重复字符,则维护ans
class Solution {
public:int lengthOfLongestSubstring(string s) {int l = 0, r = 0;int ans = 0;set<char> ss;while (r < s.size()) {if (ss.count(s[r])) {while (s[l] != s[r]) {ss.erase(s[l]);l ++ ;} l ++ ;}ss.insert(s[r]);ans = max(ans, r - l + 1);r ++ ;}return ans;}
};
84. 柱状图中最大的矩形 - 力扣(LeetCode)
解题的关键在于最小的柱子,对所有柱子进行排序,假设当前柱子的高度为h,则不用考虑高度大于h的柱子,考虑高度小于h的柱子
那么能勾勒的最大矩形为,以:向左第一个小于h的柱子与向右第一个小于h的柱子为底,高为h的矩形
从最小高度开始查找最大矩形,即可
class Solution {
public:int largestRectangleArea(vector<int>& heights) {vector<pair<int, int>> a;for (int i = 0; i < heights.size(); ++ i) {a.push_back({heights[i], i});}sort(a.begin(), a.end());set<int> s;s.insert(-1), s.insert((int)heights.size());int ans = 0;for (int i = 0; i < a.size(); ++ i) {// 根据柱子的位置找左右边界int l = *(prev(s.lower_bound(a[i].second)));int r = *(s.upper_bound(a[i].second));ans = max(ans, a[i].first * (r - l - 1));s.insert(a[i].second);}return ans;}
};