zoukankan      html  css  js  c++  java
  • leetcode:3Sum (三个数的和)

    Question: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.

    Node:

    • 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.

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

    给定一个数组S,里边有n个整数,数组中有没有三个数a、b、c使他们相加等于0,找出数组中唯一的三个数,注意a<=b<=c,答案不能包括相同的一组数。

    比如,这个数组是{-1 0 1 2-1 -4}答案是(-1,0,1)(-1,-1,2),不能有相同的.

    算法思路:① 这个题使用的比较笨的方法,时间复杂度都能达到O(n^3),很好理解,就是使用蛮力算法穷举每一种可能,设置了三个循环,本来对这个通过不抱希望,但是leetcode竟然通过了。

         ② getArray(int num1,int num2,int num3)是对num1、num2、num3排序的。

         ③ boolean compareArray(ArrayList<ArrayList<Integer>> array1,ArrayList<Integer> array2)是判断array1中是否有和array2相同的小组数的。

    代码设计:

     1 class Solution15 {
     2     public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
     3         // Note: The Solution object is instantiated only once and is reused by each test case.
     4         ArrayList <ArrayList<Integer>> arrayList=new ArrayList<ArrayList<Integer>>();//最终返回的容器类型
     5        // Integer dist[][]=new Integer[num.length][num.length];
     6         for(int i=0;i<num.length;i++){//三重循环时间复杂度太高, 可是也没想起其他好办法
     7             for(int j=i+1;j<num.length;j++){
     8                 for(int k=j+1;k<num.length;k++){
     9                     if(num[i]+num[j]+num[k]==0){
    10                         ArrayList<Integer> temp=getArray(num[i],num[j],num[k]);
    11                         if(!compareArray(arrayList, temp))
    12                             arrayList.add(temp);
    13                     }
    14                 }
    15             }
    16         }
    17         return arrayList;
    18     }
    19     boolean compareArray(ArrayList<ArrayList<Integer>> array1,ArrayList<Integer> array2){
    20         for(int i=0;i<array1.size();i++){//这个函数的作用是判断array1中是否已经包含有array2
    21             if(array1.get(i).get(0)==array2.get(0)&&array1.get(i).get(1)==array2.get(1))
    22                 return true;
    23         }
    24         return false;
    25     }
    26     ArrayList<Integer> getArray(int num1,int num2,int num3){
    27         ArrayList<Integer> arrayList=new ArrayList<Integer>();
    28         if(num1>num2){
    29             num1=num1+num2;//这一部分作用是交换两个数
    30             num2=num1-num2;
    31             num1=num1-num2;
    32         }
    33         if(num3<num2){
    34             num3=num3+num2;
    35             num2=num3-num2;
    36             num3=num3-num2;
    37         }
    38         if(num1>num2){
    39             num1=num1+num2;
    40             num2=num1-num2;
    41             num1=num1-num2;
    42         }
    43         arrayList.add(num1);//这个时候num1 num2 num3 按从小到大的顺序排列
    44         arrayList.add(num2);
    45         arrayList.add(num3);
    46         return arrayList;
    47     }
    48 }

    写的算法比较麻烦,欢迎各位留言交流。2013-10-19

  • 相关阅读:
    JavaScript判断移动端及pc端访问不同的网站
    详情点击文字展开,再点击隐藏
    让IE6/IE7/IE8浏览器支持CSS3属性
    随机输入两位数,并将其交换位置输出
    100-999的水仙花数
    C++读取文件
    求n项阶乘之和并求出和的后六位
    n的阶乘
    3*n+1问题
    完全平方数的判断
  • 原文地址:https://www.cnblogs.com/zhaolizhen/p/3Sum.html
Copyright © 2011-2022 走看看