什么叫双指针法解决leetcode
时间: 2025-02-18 07:13:18 浏览: 30
### 使用双指针算法解决 LeetCode 题目
#### 解决最长不含重复字符的子串 (Length of Longest Substring)
在处理字符串问题时,滑动窗口技术常常与双指针相结合来解决问题。对于寻找最长无重复字符子串的问题,可以通过设置两个指针 `left` 和 `right` 来表示当前考察的窗口范围,并利用哈希表记录字符出现次数。
当右端指针遍历到新字符时将其加入窗口;如果该字符已经在窗口内存在,则移动左端指针缩小窗口直至移除掉多余的相同字符。每次调整好窗口后更新最大长度值。
```cpp
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int left = 0, right = 0, n = s.size(), ret = 0;
int hash[128] = {0}; // 使用数组模拟哈希表
while(right < n){
hash[s[right]]++; // 进入窗口
// 判断是否有重复字符
while(hash[s[right]] > 1){
hash[s[left++]]--; // 出窗口
}
ret = max(ret, right - left + 1);
right++;
}
return ret;
}
};
```
此方法的时间复杂度为 O(n),其中 n 是输入字符串的长度[^2]。
#### 寻找最大连续1的数量 (Max Consecutive Ones)
针对这个问题,同样采用双指针策略,不过这里只需要关注于统计连续 '1' 的数量即可:
- 当遇到非‘1’ 或者到达字符串结尾时重置计数器并比较保存最大值;
- 继续向后扫描直到完成整个列表。
这种方法能够在线性时间内找到最大的连续一段全由‘1’组成的区间[^1]。
#### 实现最接近目标值的三个整数之和 (3Sum Closest)
为了求解这个经典面试题,先对数组进行排序以便更好地控制两头逼近的过程。设定固定元素 i 后,再用另外一对左右指针 j,k 分别指向剩余部分两端来进行探索。根据 sum=s[i]+s[j]+s[k] 是否大于还是小于 target 来决定收缩哪一侧边界从而逐步优化结果。
具体实现如下所示:
```cpp
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
int ans = nums[0] + nums[1] + nums[2];
for(int i=0;i<nums.size()-2;++i){
int l=i+1,r=nums.size()-1;
while(l<r){
int sum = nums[i]+nums[l]+nums[r];
if(abs(sum-target)<abs(ans-target))
ans=sum;
if(sum>target)--r;
else if(sum<target)++l;
else return sum; // 如果恰好等于则直接返回
}
}
return ans;
}
```
上述代码实现了高效的查找过程,时间复杂度主要取决于排序阶段即O(NlogN)[^3]。
阅读全文
相关推荐


















