zoukankan      html  css  js  c++  java
  • LeetCode 15 -- 3Sum

    Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.

    For example, given array S = {-1 2 1 -4}, and target = 1. 
    The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).

     1 public class ThreeSum {
     2     public List<List<Integer>> threeSum(int[] nums){
     3         Arrays.sort(nums);
     4         List<List<Integer>> lists = new ArrayList<List<Integer>>();
     5         List<Integer> list = new ArrayList<Integer>();
     6         for(int i = 0 ; i < nums.length ; i++){
     7             int leftPoint = i + 1;
     8             int rightPoint = nums.length - 1;
     9             while( leftPoint < rightPoint){
    10                 if (nums[i] + nums[leftPoint] + nums[rightPoint] == 0){
    11                     list.add(nums[i]);
    12                     list.add(nums[leftPoint]);
    13                     list.add(nums[rightPoint]);
    14                     lists.add((ArrayList<Integer>) list);
    15                 }
    16                     
    17                 
    18                 else if(nums[i] + nums[leftPoint] + nums[rightPoint] > 0 )
    19                     rightPoint--;
    20                 else
    21                     leftPoint++;
    22             }
    23         }
    24         return lists;
    25     }
    26 }

    貌似没有考虑好边界问题,需要修改。超时了。

    http://www.programcreek.com/2012/12/leetcode-3sum/

     1 public class ThreeSum {
     2     public List<List<Integer>> threeSum(int[] nums) {
     3         List<List<Integer>> result = new ArrayList<List<Integer>>();
     4 
     5         if (nums.length < 3)
     6             return result;
     7 
     8         // sort array
     9         Arrays.sort(nums);
    10 
    11         for (int i = 0; i < nums.length - 2; i++) {
    12             // //avoid duplicate solutions
    13             if (i == 0 || nums[i] > nums[i - 1]) {
    14 
    15                 int negate = -nums[i];
    16 
    17                 int start = i + 1;
    18                 int end = nums.length - 1;
    19 
    20                 while (start < end) {
    21                     // case 1
    22                     if (nums[start] + nums[end] == negate) {
    23                         ArrayList<Integer> temp = new ArrayList<Integer>();
    24                         temp.add(nums[i]);
    25                         temp.add(nums[start]);
    26                         temp.add(nums[end]);
    27 
    28                         result.add(temp);
    29                         start++;
    30                         end--;
    31                         // avoid duplicate solutions
    32                         while (start < end && nums[end] == nums[end + 1])
    33                             end--;
    34 
    35                         while (start < end && nums[start] == nums[start - 1])
    36                             start++;
    37                         // case 2
    38                     } else if (nums[start] + nums[end] < negate) {
    39                         start++;
    40                         // case 3
    41                     } else {
    42                         end--;
    43                     }
    44                 }
    45 
    46             }
    47         }
    48 
    49         return result;
    50     }
    51 }

     http://stackoverflow.com/questions/10732522/difference-between-two-similar-algorithms-of-3sum

    通过hashSet实现

  • 相关阅读:
    使用Xposed+JustTrustMe来突破SSL Pinning
    反编译工具
    java练习生 使用feign
    java练习生 AOP【日志】【异常处理】
    java 中string类型转Date类型和Date类型转string类型
    Metro Style App 异步简洁而不简单的异步
    Metro Style app :浏览器扩展
    用async 解放你的大脑
    Metro Style App :推送概述(二)
    Metro Style App :Framwork与WinRT(二)
  • 原文地址:https://www.cnblogs.com/myshuangwaiwai/p/4686053.html
Copyright © 2011-2022 走看看