leetcode-15:三数之和

简介: leetcode-15:三数之和

题目

题目链接

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组

解题

方法一:排序+双指针

python写法

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        n = len(nums)
        if (not nums or n<3):
            return []
        nums.sort()
        res = []
        for i in range(n):
            if nums[i]>0:
                return res
            if (i>0 and nums[i]==nums[i-1]):
                continue
            L = i+1
            R = n-1
            while L<R:
                if nums[i]+nums[L]+nums[R]==0:
                    res.append([nums[i],nums[L],nums[R]])
                    while L<R and nums[L]==nums[L+1]:
                        L = L+1
                    while L<R and nums[R]==nums[R-1]:
                        R = R-1
                    L = L+1
                    R = R-1
                elif nums[i]+nums[L]+nums[R]<0:
                    L=L+1
                else:
                    R=R-1
        return res

c++写法

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        int n=nums.size();
        if(n<3){
            return {};
        }
        sort(nums.begin(),nums.end());
        vector<vector<int>> res;
        for(int i=0;i<n;i++){
            if(nums[i]>0){
                break;
            }
            if(i>0&&nums[i]==nums[i-1]){
                continue;
            }
            int L=i+1,R=n-1;
            while(L<R){
                int s=nums[i]+nums[L]+nums[R];
                if(s==0){
                    res.push_back({nums[i],nums[L],nums[R]});
                    while(L<R&&nums[L]==nums[L+1]){
                        L++;
                    }
                    while(L<R&&nums[R]==nums[R-1]){
                        R--;
                    }
                    L++;
                    R--;
                }
                else if(s<0){
                    L++;
                }
                else{
                    R--;
                }
            }
        }
        return res;
    }
};

java写法

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        int n=nums.length;
        List<List<Integer>> res=new ArrayList<>();
        Arrays.sort(nums);
        for(int i=0;i<n;i++){
            if(nums[i]>0) break;
            if(i>0&&nums[i]==nums[i-1]) continue;
            int L=i+1,R=n-1;
            while(L<R){
                int s=nums[i]+nums[L]+nums[R];
                if(s==0){
                    // List<Integer> list=new ArrayList<>();
                    // list.add(nums[i]);
                    // list.add(nums[L]);
                    // list.add(nums[R]);
                    // res.add(list);
                    res.add(Arrays.asList(nums[i],nums[L],nums[R]));
                    while(L<R&&nums[L]==nums[L+1]){
                        L++;
                    }
                    while(L<R&&nums[R]==nums[R-1]){
                        R--;
                    }
                    L++;
                    R--;
                }
                else if(s<0){
                    L++;
                }else{
                    R--;
                }
            }
        }
        return res;
    }
}
相关文章
|
1月前
【LeetCode 16】15.三数之和(双指针法)
【LeetCode 16】15.三数之和(双指针法)
30 1
|
1月前
【LeetCode 15】15.三数之和
【LeetCode 15】15.三数之和
34 0
|
3月前
|
算法
LeetCode第15题三数之和
该文章介绍了 LeetCode 第 15 题三数之和的解法,通过先对数组排序,使用双指针减少循环层数,依次取一个元素作为第一个元素,通过双指针法寻找符合条件的三元组,并进行去重处理,同时总结了 2 数之和可使用哈希表解决,超过 2 数之和可使用双指针减少循环次数。
LeetCode第15题三数之和
|
5月前
|
算法 容器
【LeetCode刷题】三数之和、四数之和
【LeetCode刷题】三数之和、四数之和
|
6月前
|
Java
leetcode-53:最大子序和
leetcode-53:最大子序和
36 0
|
存储 测试技术 C++
力扣1-两数之和&力扣15-三数之和
力扣1-两数之和&力扣15-三数之和
80 0
|
存储
每日一题——三数之和(双指针)
每日一题——三数之和(双指针)
|
算法 测试技术
leetcode:15.三数之和
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
78 0
每日一题——四数之和(双指针解法)
每日一题——四数之和(双指针解法)
|
测试技术 索引
leetcode_15. 三数之和
题目链接: 15. 三数之和 据说华为的机试经常考这题,而且这道题也是扩展性极强的一道题,你可以看到18. 四数之和,或者人为修改的五数之和,六数之和,乃至n 数之和,也就是
leetcode_15. 三数之和