[LintCode/LeetCode] 3Sum

news/2024/7/3 8:20:55

Problem

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

Notice

Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)

The solution set must not contain duplicate triplets.

Example

For example, given array S = {-1 0 1 2 -1 -4}, A solution set is:

(-1, 0, 1)
(-1, -1, 2)

Note

双指针法:O(n^2)的解法。
遍历第一个到倒数第三个数nums[i],作为三数数列的队首;
nums[i]后面的一个数作为三数数列中的第二个数nums[left]
数组中最后一个数nums[nums.length-1]作为三数数列中的第三个数nums[right]
然后用leftright夹逼找到使三数和为零的三数数列,放入结果数组res
对于这三个数,如果循环的下一个数值和当前数值相等,就跳过以避免res中有相同的解。

Solution

public class Solution {
    public ArrayList<ArrayList<Integer>> threeSum(int[] A) {
        ArrayList<ArrayList<Integer>> res = new ArrayList();
        if (A.length < 3) return null;
        Arrays.sort(A);
        for (int i = 0; i <= A.length-3; i++) {
            int left = i+1, right = A.length-1;
            if (i != 0 && A[i] == A[i-1]) continue;
            while (left < right) {
                int sum = A[i]+A[left]+A[right];
                if (sum == 0) {
                    ArrayList<Integer> temp = new ArrayList();
                    temp.add(A[i]);
                    temp.add(A[left]);
                    temp.add(A[right]);
                    res.add(temp);
                    left++;
                    right--;
                    while (left < right && A[left] == A[left-1]) left++;
                    while (left < right && A[right] == A[right+1]) right--;
                }
                else if (sum < 0) left++;
                else right--;
            }
        }
        return res;
    }
}

update 2018-9

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        if (nums == null || nums.length < 3) return res;
        
        Arrays.sort(nums);

        for (int i = 0; i < nums.length-2; i++) {
            if (i == 0 || (i > 0 && nums[i] != nums[i-1])) {
                int sum = 0-nums[i];
                int l = i+1, r = nums.length-1;
                
                while (l < r) {
                    int curSum = nums[l]+nums[r];
                    if (curSum == sum) {
                        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--;
                    } else if (curSum < sum) {
                        l++;
                    } else {
                        r--;
                    }
                }
                
            }
        }
        return res;
    }
}

http://www.niftyadmin.cn/n/1973686.html

相关文章

两个元素的矩阵乘除法

矩阵的乘除法&#xff1a; 1 矩阵相乘&#xff0c;两个矩阵只有当左边的矩阵的列数等于右边矩阵的行数时,两个矩阵才可以进行矩阵的乘法运算 主要方法就是&#xff1a;用左边矩阵的第一行&#xff0c;逐个乘以右边矩阵的列&#xff0c;第一行与第一列各个元素的乘积相加&#x…

FragmentActivity中关于actionbar的设置问题

ActionBar有三个东西&#xff0c;左侧图标&#xff0c;标题&#xff0c;右侧模式&#xff0c;LIST和TABS 一般如果设置为TABS&#xff0c;就不要左侧图标和标题&#xff1a; mActionBar.setDisplayShowHomeEnabled(false); mActionBar.setDisplayShowTitleEnabled(fals…

实用ExtJS教程100例-001:开天辟地的Hello World

ExtJS功能繁多&#xff0c;要想彻底的了解确实很困难。作为初学者&#xff0c;如何能找到一条快速的通道呢&#xff1f;我觉得&#xff0c;如果你有Javascript的基础&#xff0c;那就不要惧怕ExtJS的复杂&#xff0c;从动手开始&#xff0c;遇到问题&#xff0c;解决问题&#…

[Java面试五]Spring总结以及在面试中的一些问题.

[Java面试五]Spring总结以及在面试中的一些问题. 1.谈谈你对spring IOC和DI的理解&#xff0c;它们有什么区别&#xff1f; IoC Inverse of Control 反转控制的概念&#xff0c;就是将原本在程序中手动创建UserService对象的控制权&#xff0c;交由Spring框架管理&#xff0c…

ffmpeg-20160522-git-bin

ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 S 下一帧 [ -2秒 ] 2秒 ; -1秒1秒 < -0.05秒 > 下一个帧 -> -5秒ffmpeg-20160522-git-bin.7z转载于:https://www.c…

【Java面试12】常用算法(冒泡、插入、选择、快速)和二叉树详解

常用算法&#xff08;冒泡、插入、选择、快速&#xff09;和二叉树详解 同一问题可用不同算法解决&#xff0c;而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。 计算机科学中&#xff0c;算法的时间复杂度是一个函数&#xff0c;…

1、用户信息(表)

--1、用户信息create table users( users_id Int Identity Primary key,--用户编号 users_name varchar(50) not null,--用户名 users_pass varchar(32) not null,--用户密码 true_name varchar(50) not null,--真实姓名 user_sex varchar(2) not null,--性别 user_phone…