双指针算法Leetcode015三数之和(试探法)

地址

https://leetcode-cn.com/problems/3sum/submissions/

描述

在这里插入图片描述

思路

在这里插入图片描述

问题:

1、试探算法:怎么实现尽可能找最小的k?(算法思想值得学习)
在这里插入图片描述
假如k-1>j,就说明k的左边相邻数任然>j,没有越界,且nums[i]+nums[j]+nums[k-1]>=0,那么k指针就向左移动,达到尽可能小的目的。
2、 i 指针需要跳过我理解了,为什么 j 指针也要?
在这里插入图片描述
举出反例
少了这句:
在这里插入图片描述
出现重复
在这里插入图片描述

代码

class Solution {
    
    
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
    
    
        vector<vector<int>> res;//答案数组
        //使用双指针算法,一定要先进行排序
        sort(nums.begin(),nums.end());
        //指针i<j<k
        for(int i=0;i<nums.size();i++){
    
    
            //这个数与前面与之相邻的数相同,跳过,防止出现重复
            if(i>0&&nums[i-1]==nums[i]) continue;
            for(int j=i+1,k=nums.size()-1;j<k;j++){
    
    
                //防止重复
                if(j>i+1&&nums[j]==nums[j-1]) continue;
                //试探算法,尽可能找最小的k
                while(k-1>j&&nums[i]+nums[j]+nums[k-1]>=0) k--;
                if(nums[i]+nums[j]+nums[k]==0) res.push_back({
    
    nums[i],nums[j],nums[k]});
            }

        }
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_52934831/article/details/121314626
今日推荐