三数之和

2022-02-20  本文已影响0人  赵老拖

描述

给出一个有n个元素的数组S,S中是否有元素a,b,c满足a+b+c=0?找出数组S中所有满足条件的三元组。

数据范围:0≤n≤10000≤n≤1000,数组中各个元素值满足 ∣val∣≤100∣val∣≤100

空间复杂度:O(n2)O(n2),时间复杂度 O(n2)O(n2)

注意:

三元组(a、b、c)中的元素必须按非降序排列。(即a≤b≤c)

解集中不能包含重复的三元组。

例如,给定的数组 S = {-10 0 10 20 -10 -40},解集为(-10, -10, 20),(-10, 0, 10)


import java.util.*;

public class Solution {

    public ArrayList<ArrayList<Integer>> threeSum(int[] num) {

      ArrayList<ArrayList<Integer>> ans = new ArrayList<>();
     if(num == null){

            return ans;

        }

        int len = num.length;

        if(len<3){

            return ans;

        }

        Arrays.sort(num);

      //第一轮遍历,找到第一个值位置

        for(int i = 0;i<len;i++){

            if(num[i]>0){

                return ans;

            }

           //如果值跟之前一样,结果是一样,去重使用

            if(i>0 && num[i] == num[i-1]){

                continue;

            }

            int cur = num[I];

          //第二轮遍历

            int left = i+1;

            int right = len-1;

            while(left<right){

                if(cur + num[left]+num[right] == 0){

                  ArrayList<Integer> list = new ArrayList<>();

                  list.add(cur);

                  list.add(num[left]);

                  list.add(num[right]);

                  ans.add(list);

                  while(left<right && num[left] == num[left+1]){

                      left++;

                  }

                  while(left<right && num[right] == num[right-1]){

                      right--;

                  }

                  left++;

                  right--;

                }else if(cur + num[left]+num[right] < 0){

                    left++;

                }else{

                    right--;

                }

            }

        }

        return ans;

    }

}

上一篇下一篇

猜你喜欢

热点阅读