面试经典 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进行遍历,如果ti==sj,那么寻找下一个,最后判断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(hl,hr);

那么就可以使用双指针来进行边界的处理;

设定l,r分别指向两边,如果hl<hr,那么l右移,否者r左移,在遍历的过程中,更新答案;

c++代码 :

cpp 复制代码
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++代码 :

cpp 复制代码
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代码 :

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 ; 
    }
}
相关推荐
黎阳之光科技管控11 分钟前
纯视觉定位赋能海关口岸 无感通关提升国门安全与效率
算法·安全
小江的记录本12 分钟前
【Spring全家桶】Spring AI核心原理、大模型集成、Prompt工程、RAG实现、AI Agent开发(附《思维导图》+《面试高频考点清单》)
java·人工智能·spring boot·后端·spring·面试·prompt
EMA15 分钟前
Agent开发中数据分析图表工具分层暴露方案总结
面试
晚风吹红霞20 分钟前
深入浅出 STL 之 map 与 set:从入门到实战
开发语言·c++
じ☆冷颜〃21 分钟前
Picard–Lindelöf定理在CS中的应用:理论框架与算法基础
人工智能·经验分享·笔记·算法·机器学习
牛油果子哥q24 分钟前
【C++封装】C++封装思想与访问权限终极精讲:public/private/protected权限解析、类封装设计、继承权限变化、工程私有化规范与面试坑点
c++·面试
织梦旅途24 分钟前
C++ 第一课 从 Hello Word!立刻开始
c++
不知名的老吴25 分钟前
机器学习评价之基础指标
人工智能·算法·机器学习
Felven25 分钟前
D. Divisible Pairs
算法
源代码杀手26 分钟前
基于ROS2+Gazebo+RIVE的40项计算机视觉前沿机器人项目(含视觉算法原理与源码获取方式)
算法·计算机视觉·机器人