Leetcode:15.三数之和

这道题是一道双指针解决的例题,从字面上看,能想到的暴力解法就是三重循环,但是如果数据量过大的时候,时间复杂度会很高,所以我们要想办法减少循环次数,第二个循环和第三个循环都是在前一个循环的基础上对后面的数进行遍历,所以我们可以将第二个循环和第三个循环合并成一个循环,在我们确定第二个元素之后,我们只需要移动三个元素,来看三个数是否符合要求,这里我们设置一个变量target = -numsi (i为第一个元素的下标) 这样就变成了一个两数之和。

另外题目要求我们不能有重复的三元组,所以我们可以对所给数组进行排序+当前元素与前一个元素进行比较,这样就保证了不会有重复的三元组

cpp 复制代码
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        int n = nums.size();
        sort(nums.begin(),nums.end());
        vector<vector<int>> vec;
        for(int i = 0;i < n-2;i++){
            int x = nums[i];
            if (x + nums[i + 1] + nums[i + 2] > 0) break; 
            if (x + nums[n - 2] + nums[n - 1] < 0) continue; 
            if(i>0&&nums[i]==nums[i-1]){
                continue;
            }
            int k = n-1,target = -nums[i];
            for(int j = i + 1;j < n-1;j++){
                if(j>i+1&&nums[j]==nums[j-1]){
                    continue;
                }
                while(j<k&&nums[j]+nums[k]>target){
                    k--;
                }
                if(j==k) break;
                if(nums[j]+nums[k]==target){
                    vec.push_back({nums[i],nums[j],nums[k]});
                }
            }
        }
        return vec;
    }
};
相关推荐
2401_872418787 小时前
算法入门:数据结构-堆
数据结构·算法
xwz小王子9 小时前
手术机器人登上Science Robotics:2毫米纤细手臂,从3厘米切口完成腰椎神经减压
算法·机器人
拼尽全力前进9 小时前
Guava Cache vs Caffeine 面试详解
面试·职场和发展·guava
黎阳之光10 小时前
视频孪生智护供水生命线:黎阳之光赋能医疗与园区水务高质量升级
运维·物联网·算法·安全·数字孪生
程序员小远10 小时前
Python自动化测试框架及工具详解
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
Black蜡笔小新10 小时前
自动化AI算法训练服务器DLTM制造业AI质检工作站助力制造业实现AI智检
人工智能·算法·自动化
嵌入式小能手10 小时前
飞凌嵌入式ElfBoard-进程间的通信之命名管道
linux·服务器·算法
啦哈拉哈11 小时前
Leetcode题解记录-hot100(81-100)
算法·leetcode·职场和发展
csdn_aspnet11 小时前
Java 霍尔分区算法(Hoare‘s Partition Algorithm)
java·开发语言·算法
诸葛务农11 小时前
道路行驶条件下电动汽车永磁电机的有效使用寿命及永磁体的失效和回收再利用(下)
java·开发语言·算法