Leetcode-3Sum Closest

来源:互联网 发布:hl系统线切割怎么编程 编辑:程序博客网 时间:2024/06/10 04:17

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


My Solutio :

import java.lang.reflect.Array;import java.util.ArrayList;import java.util.Arrays;import java.util.Collection;import java.util.Collections;import java.util.HashMap;import java.util.List;public class Solution {public List<List<Integer>> threeSum(int[] nums) {        HashMap<Integer, Integer> map = new HashMap<>();                List<List<Integer>> ans = new ArrayList<List<Integer>>();                for (int i = 0; i < nums.length; i++) {        map.put(nums[i], i);        }                Arrays.sort(nums);                for (int i = 0; i < nums.length; i++) {        for (int j = i + 1; j < nums.length; j++ ) {                int complement = - (nums[i] + nums[j]);                   if (map.containsKey(complement)) {        int complementIndex = map.get(complement);        if ( complementIndex != i && complementIndex != j) {        List<Integer> res = new ArrayList<>();                        res.add(nums[i]);            res.add(nums[j]);            res.add(complement);            Collections.sort(res);                        boolean isExit = false;                        for (int x = 0; x < ans.size(); x++) {            boolean same = true;            for (int y = 0; y < ans.get(x).size(); y ++) {            if (ans.get(x).get(y) != res.get(y)) {            same = false;            break;            }            }            if (same) {            isExit = true;            break;            }            }                        if(!isExit)            ans.add(res);                    }        }        }        }              return ans;    }}

Better Solution :

import java.util.ArrayList;import java.util.Arrays;import java.util.List;import javax.security.auth.kerberos.KerberosKey;public class Solution2 {public List<List<Integer>> threeSum(int[] nums) {Arrays.sort(nums);List<List<Integer>> ans = new ArrayList<List<Integer>>();for (int i = 0; i < nums.length - 2; i++) {if (i > 0 && nums[i] == nums[i - 1]) {continue;}int target = - nums[i];int j = i + 1, k = nums.length - 1;while (j < k) {if (nums[j] + nums[k] == target) {ans.add(Arrays.asList(nums[i], nums[j], nums[k]));j ++;k --;while (j < k && nums[j] == nums[j - 1]) {j ++;} while (j < k && nums[k] == nums[k + 1]) {k --;}} else if (nums[j] + nums[k] > target) {k --;} else {j ++;}}}return ans;}}


原创粉丝点击