本文介绍: 面试经典 150 题 — 双指针 (总结)
125 . 验证回文串
先对字符串进行预处理把大写字符转小写,然后将字母和数字全存入一个vector<char>中 ;
然后运用双指针·来进行判断 ;
class Solution {
public:
bool isPalindrome(string s) {
int n = s.size();
vector<char> ans;
for(char c : s){
if(c>='A' && c<='Z'){
char ch = c+'a'-'A';
ans.emplace_back(ch);
}else if(c>='a' && c<='z' || c>='0'&&c<='9'){
ans.emplace_back(c);
}
}
int ant = ans.size();
int i=0,j=ant-1;
while(i<=j){
if(ans[i] == ans[j]){
i++;
j--;
}else {
return false;
}
}
return true;
}
};
392 . 判断子序列
用双指针来进行判断 ;
双指针,一个用于遍历t,一个对于s,对t进行遍历,如果t[i]==s[j],那么寻找下一个,最后判断j==n;
class Solution {
public:
bool isSubsequence(string s, string t) {
int sn = s.size() , tn = t.size() ;
int j = 0 ;
for(int i=0;i<tn;i++){
if(s[j]==t[i])j++;
if(j==sn) return true ;
}
return j==sn;
}
};
167 . 两数之和 II – 输入有序数组
双指针
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
// 双指针
int n = nums.size() ;
int i = 0 , j = n - 1 ;
while(i<j){
int s = nums[i] + nums[j];
if(s==target) break;
if(s>target) j--;
else i++;
}
return {i+1,j+1};
}
};
11 . 盛水最多的容器
对于已经确定好的两条边l,r,那么两边夹起来的容积就是 : (r-l) * min(h[l],h[r]);
那么就可以使用双指针来进行边界的处理;
设定l,r分别指向两边,如果h[l]<h[r],那么l右移,否者r左移,在遍历的过程中,更新答案;
c++代码 :
class Solution {
public:
int maxArea(vector<int>& h) {
int ans = 0 ;
int l = 0, r = h.size()-1;
while(l<r){
if(h[l]<h[r]){
ans = max(ans , (r-l) * h[l++] );
}else{
ans = max (ans , (r-l) * h[r--]);
}
}
return ans ;
}
};
15 . 三数之和
双指针
c++代码 :
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
int n = nums.size();
vector<vector<int>> ans;
sort(nums.begin(),nums.end());
for(int i=0;i<n-2;i++)
{
int x = nums[i];
if(x+nums[i+1]+nums[i+2] > 0) return ans;//如果三数和最小值大于0,那么直接返回
if(x+nums[n-1]+nums[n-2]<0) continue;
// 对a去重
if(i>0 && nums[i] == nums[i-1]) continue;
int left = i+1;
int right = n-1;
while(right>left)
{
int x = nums[i] + nums[left] + nums[right];
if(x > 0) right--;
else if(x < 0) left++;
else
{
ans.push_back(vector<int>{nums[i],nums[left],nums[right]});
while(left<right && nums[right] == nums[right-1]) right--;
while(left < right && nums[left] == nums[left+1]) left ++;
left++;
right--;
}
}
}
return ans;
}
};
java代码 :
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
int n = nums.length ;
List<List<Integer>> ans = new ArrayList<>() ;
Arrays.sort(nums);
for(int k = 0 ; k < n - 2 ; k ++){
if(nums[k] > 0) break;
if(k>0 && nums[k]==nums[k-1]) continue ;
int i = k + 1 , j = n - 1;
while(i < j){
int sum = nums[k] + nums[i] + nums[j] ;
if(sum < 0){
while(i<j && nums[i]==nums[++i]);
}else if(sum > 0){
while(i<j && nums[j]==nums[--j]);
}else{
ans.add(new ArrayList<Integer>(Arrays.asList(nums[k],nums[i],nums[j]))) ;
while(i<j && nums[i]==nums[++i]);
while(i<j && nums[j]==nums[--j]);
}
}
}
return ans ;
}
}
原文地址:https://blog.csdn.net/ros275229/article/details/135956855
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_65651.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。