zoukankan      html  css  js  c++  java
  • Leetcode-3Sum

    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:

    • Elements in a triplet (a,b,c) must be in non-descending order. (ie, abc)
    • 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)
    
    Have you met this question in a real interview?
     
    Analysis:
     
    Solution:
     1 public class Solution {
     2     public List<List<Integer>> threeSum(int[] num) {
     3         List<List<Integer>> resList = new ArrayList<List<Integer>>();
     4         if (num.length<3) return resList;        
     5 
     6         Arrays.sort(num);
     7         Map<Integer,Integer> numMap = new HashMap<Integer,Integer>();
     8         for (int i=0;i<num.length;i++)
     9             if (numMap.containsKey(num[i]))
    10                 numMap.put(num[i],numMap.get(num[i])+1);
    11             else numMap.put(num[i],1);
    12 
    13         int first = 0;
    14         int second = -1;
    15         while (first<num.length-2){            
    16             numMap.put(num[first],numMap.get(num[first])-1);
    17             second = first+1;
    18             while (second<num.length-1){
    19                 numMap.put(num[second],numMap.get(num[second])-1);
    20                 int left = 0-num[first]-num[second];
    21                 if (left>=num[second] && numMap.containsKey(left) && numMap.get(left)>0){
    22                     List<Integer> temp = new LinkedList<Integer>();
    23                     temp.add(num[first]);
    24                     temp.add(num[second]);
    25                     temp.add(left);
    26                     resList.add(temp);
    27                 }
    28                 numMap.put(num[second],numMap.get(num[second])+1);
    29                 if (left<num[second]) break;
    30                 while (second< num.length-1 && num[second]==num[second+1]) second++;
    31                 second++;
    32             }
    33             numMap.put(num[first],numMap.get(num[first])+1);
    34             while (first<num.length-2 && num[first]==num[first+1]) first++;
    35             first++;
    36 
    37         }
    38 
    39         return resList;       
    40     }
    41 }

     NOTE: There is a way to solve this problem without using hashmap. Practice it!

    Solution2: Two pointers.

    The key point here is that:

    if p1+p2+p3==0, then p2++ and p3--.

     1 public class Solution {
     2     public List<List<Integer>> threeSum(int[] num) {
     3        List<List<Integer>> res = new ArrayList<List<Integer>>();
     4        if (num.length<3) return res;
     5        Arrays.sort(num);
     6     
     7        
     8  
     9        //Find each solution.
    10        int p1 = 0;
    11        int p2,p3;
    12        while (p1<num.length-2 && num[p1]<=0){
    13            p2 = p1+1;
    14            p3 = num.length-1;
    15            while (p2<p3 && -num[p1]-num[p2]>=num[p2]){
    16                int sum = num[p1]+num[p2]+num[p3];
    17                if (sum==0){
    18                    List<Integer> sol = new ArrayList<Integer>();
    19                    sol.add(num[p1]);
    20                    sol.add(num[p2]);
    21                    sol.add(num[p3]);
    22                    res.add(sol);
    23                }
    24 
    25                if (sum<=0){
    26                    p2++;
    27                    while (p2<p3 && num[p2]==num[p2-1]) p2++;
    28                } 
    29 
    30                if (sum>=0){
    31                    p3--;
    32                    while (p2<p3 && num[p3]==num[p3+1]) p3--;
    33                }
    34           }          
    35           p1++;
    36           while (p1<num.length-2 && num[p1]==num[p1-1]) p1++;
    37        }
    38 
    39        return res;
    40         
    41     }
    42 }
  • 相关阅读:
    架构 框架 设计模式 --备用
    机器视觉项目开发之---织物疵点检测机器视觉系统 软件测试平台
    多媒体开发之--- live555 vs2010/vs2013下编译,使用,测试
    多媒体开发之--- h264 图像、帧、片、NALU
    多媒体开发之---H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流
    多媒体开发之---h264格式slice_header
    图像处理之基础---傅立叶c实现
    图像处理之基础---小波提取特征
    图像处理之基础---图像的特征简介
    嵌入式开发之工具---log file
  • 原文地址:https://www.cnblogs.com/lishiblog/p/4127609.html
Copyright © 2011-2022 走看看