avatar

目录
指针专题
  1. 三数之和
    首先固定一个数,然后另外两个数用两个指针去探索记录和为0的组合。
    对于前后一样的数可以跳过
c++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
int target;
vector<vector<int>> ans;
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); i++) {
target= nums[i];
if (target > 0) break;
if (i > 0 && nums[i] == nums[i - 1]) continue;
int l = i + 1, r = nums.size() - 1;
while (l < r) {
if (nums[l] + nums[r] + target < 0) ++l;
else if (nums[l] + nums[r] + target > 0) --r;
else {
ans.push_back({target, nums[l], nums[r]});
++l, --r;
while (l < r && nums[l] == nums[l - 1]) ++l;
while (l < r && nums[r] == nums[r + 1]) --r;
}
}
}
return ans;
}
};

二、滑动窗口
3. 无重复字符的最长子串
滑动窗口的本质也是双指针,两个指针分别代表某个子串的两端,用ss这个字典来表示某个字符最新出现的位置,当右指针遍历到一个新字符,就检查一下这个元素最新的位置c,这个新串的起始位置就是c+1,每一个窗口就比较一下获得最大值。

c++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public:
int lengthOfLongestSubstring(string s) {
map<char, int>ss;
int max_len = 0;
int left = 0;
for (int j = 0; j < s.size(); j++) {
if (ss.find(s[j]) != ss.end()) {
left = max(left, ss[s[j]] + 1);
}
int cur_len = j - left + 1;
if (max_len < cur_len)
max_len = cur_len;
if (ss.find(s[j]) != ss.end())
ss.erase(s[j]);
ss[s[j]] = j;
}
return max_len;
}
};
文章作者: Sunxin
文章链接: https://sunxin18.github.io/2020/07/22/double-pointer/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 lalala
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论