美文网首页LeetCode
LeetCode-array-3Sum

LeetCode-array-3Sum

作者: 萤火之森ss | 来源:发表于2017-07-04 16:10 被阅读10次

(头疼,做的时候细节错误百出,然而这只是一道mid难度,在代码中,for循环里可以精简优化一些,指针的排重)
题目:
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.
Note: The solution set must not contain duplicate triplets.

意思是给出一个数组,能够组成 a+ b+ c =0的情况,不能重复

思路分析:固定一个值,其他俩指针分别从两边往里循环,要排重。

java代码如下

package LeetCode1;
import java.util.*;
/**
 * Created by Wangjianxin on 2017/7/4 0004.
 *
 */
public class ThreeSum {

    public static void main(String[] args) {
        int [] array  = {-2,0,0,2,2};
        System.out.println(threeSum(array));
    }
    public static List<List<Integer>> threeSum(int[] nums) {
        
       
        List<List<Integer>> list = new LinkedList<List<Integer>>();
        int len = nums.length;
        
        //这里需要排序,从小到大,可以用 Arrays.sort(nums);
        for(int i =0;i<len ;i++){
            for(int j =0;j< len - i -1;j++){
                if(nums[j] > nums[j+1]){
                    int temp = nums[j];
                    nums[j] = nums[j+1];
                    nums[j+1] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(nums));
        if(nums.length == 0 || nums[0] > 0){
            return list;
        }
  
//开始循环
        for(int i= 0;i<len;i++){
            int start = i;
            int left = i +1;
            int right = len -1;
            //排除固定数(start)的重复,除去第一次遍历的时候
            if(i > 0 && nums[i] == nums[i-1]){
                continue;
            }
            while (left < right){
                int sum = nums[start] + nums[left] + nums[right];
                if(sum > 0){
                    right --;
                }
                else if(sum < 0){
                    left ++;
                }
                //这个是当左指针不能再最左边,时候左指针排重
                else if (left != i +1  && nums[left] == nums[left-1]){
                    left ++;
                }
                //同理,
                else if (right != len -1 && nums[right] == nums[right+1]) {
                    right --;
                }
                else{
                    List<Integer> list1 = new LinkedList<Integer>();
                    list1.add(nums[start]);
                    list1.add(nums[left]);
                    list1.add(nums[right]);
                    list.add(list1);
                    //找到后,指针继续往里
                    left ++;
                    right --;
                }
            }
        }
        return list;
    }
}

相关文章

  • LeetCode-array-3Sum

    (头疼,做的时候细节错误百出,然而这只是一道mid难度,在代码中,for循环里可以精简优化一些,指针的排重)题目:...

  • LeetCode-array-3Sum Closest

    题目:Given an array S of n integers, find three integers in...

网友评论

    本文标题:LeetCode-array-3Sum

    本文链接:https://www.haomeiwen.com/subject/sglxhxtx.html