LeetCode 15. 3Sum

本文介绍LeetCode经典问题“三数之和”的解决方案。通过先排序再使用双指针技巧,有效地找到数组中所有不重复的三元组,使得它们的和为零。文章提供了一个Java实现示例。

Given an array S of n integers, are there elements abc in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note: The solution set must not contain duplicate triplets.

For example, given array S = [-1, 0, 1, 2, -1, -4],

A solution set is:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

Subscribe to see which companies asked this question.

LeetCode经典问题:*sum问题

暴力求解是n^*的复杂度,不可取。

整体思路是先排序(nlogn),然后使用三个指针,其中一个a从头部向尾部移动,另外两个b,c在a和尾部之间做搜索,可以通过比较值或者利用set的数据结构两种方式达到去重的目的。

import java.util.*;
public class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        if(nums.length<3){
            return res;
        }
        Arrays.sort(nums);
        int len = nums.length;
        for(int i=0;i<len-2;i++){
            if(nums[i]>0)break;
            if(i>0&&nums[i]==nums[i-1])continue;
            int j=i+1,k=len-1;
            while(j<k){
                if(nums[i]+nums[j]+nums[k]==0){
                    List<Integer>list = new ArrayList<Integer>();
                    list.add(nums[i]);
                    list.add(nums[j]);
                    list.add(nums[k]);
                    res.add(list);
                    while(j<k&&nums[j]==nums[j+1])j++;
                    while(j<k&&nums[k]==nums[k-1])k--;
                    j++;
                    k--;
                }

                else if(nums[i]+nums[j]+nums[k]>0){
                   k--;
                }
                else j++;
            }
        }
        return res;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值