Leetcode - 3Sum Closest

Question:

Leetcode - 3Sum Closest_第1张图片
Paste_Image.png

My code:

import java.util.Arrays;
import java.util.HashMap;

public class Solution {
    public int threeSumClosest(int[] nums, int target) {
        if (nums == null || nums.length < 3)
            return 0;
        Arrays.sort(nums);
        int minX = Integer.MAX_VALUE;
        int min = 0;
        HashMap h = new HashMap();
        for (int i = 0; i < nums.length - 2; i++) {
            int findResult = target - nums[i];
            if (h.containsKey(findResult))
                continue;
            else
                h.put(findResult, nums[i]);
            int start = i + 1;
            int end = nums.length - 1;
            while ((i == 0 || nums[i] != nums[i - 1]) && start < end) {
                if (minX > Math.abs(nums[start] + nums[end] - findResult)) {
                    minX = Math.abs(nums[start] + nums[end] - findResult);
                    min = nums[start] + nums[end] + nums[i];
                }
                if (nums[start] + nums[end] > findResult) {
                    end--;
                    while (start < end && nums[end] == nums[end + 1])
                        end--;
                }
                else if (nums[start] + nums[end] < findResult) {
                    start++;
                    while (start < end && nums[start] == nums[start - 1])
                        start++;
                }
                else {
                    return target;
                }
            }
        }
        return min;
    }
    
    public static void main(String[] args) {
        Solution test = new Solution();
        int[] a = {1, 1, 1, 0};
        System.out.println(test.threeSumClosest(a, -100));
    }
}

My test result:

Leetcode - 3Sum Closest_第2张图片
Paste_Image.png

和昨天的题目差不多,3Sum.
只不过这个不是找三个数等于0,而是找三个数最接近target。
那么,就是找 nums[start] + nums[end] 最接近 target - nums[i].
并且可以每次都把target - nums[i] 存入哈希表, 遍历之前,先看下哈希表有没有这个值。如果有的话,说明距离这个值最近的所有情况都已经找过了,不需要再找了。直接continue结束这次循环。

**
总结:没什么好总结的。做这道题目的时候人比较暴躁,刚跟女朋友吵完架。
只是生气,为什么什么事情都是那么的犹豫不确定,然后别人一催,还要发火。
托福也是,该不该退考。
出国也是,昨天突然又冒出来什么Plan B。加拿大,日本。
这次旅游也是。昨天和我说她爸默认允许了。我今天还高兴地和我爸说来着。结果,中午她又改口,说不确定她爸的态度,然后进一步问,她又说不知道,不要再逼她了,她要考试。
我真的感觉自己快受够了。
我的确爱她,但现在我发现,就算爱,两个人也不一定合适。她身上有太多我所讨厌的习惯了,不是生活习惯,是精神习惯。
我和她能走多远?我不知道。
我只知道,结束的那一刻,我一定不会再有2015年五月那次那么伤心了。
少年,先谈自爱,再说他爱。
**
Anyway, Good luck, Richardo!

import java.util.Arrays;

public class Solution {
    public int threeSumClosest(int[] nums, int target) {
        if (nums == null || nums.length < 3)
            return 0;
        Arrays.sort(nums);
        int minSum = 0;
        int closest = Integer.MAX_VALUE;
        for (int i = 0; i < nums.length; i++) {
            if (i >= 1 && nums[i] == nums[i - 1])
                continue;
            int find = target - nums[i];
            int start = i + 1;
            int end = nums.length - 1;
            while (start < end) {
                int diff = find - nums[start] - nums[end];
                if (Math.abs(diff) < closest) {
                    closest = Math.abs(diff);
                    minSum = target - diff;
                }
                if (diff == 0)
                    break;
                else if (diff > 0)
                    start++;
                else
                    end--;
            }
        }
        return minSum;
    }
    
    public static void main(String[] args) {
        Solution test = new Solution();
        int[] nums = new int[]{-1, 2, 1, -4};
        System.out.println(test.threeSumClosest(nums, 1));
    }
}

要用什么哈希啊。。。并不需要。
感觉思路更加清晰了。
再强调一次!
写代码的时候,尽量少用多个逻辑再加上与或的判断。会让代码的可读性大大降低!
比如老版本中的,

while ((i == 0 || nums[i] != nums[i - 1]) && start < end) {

What a fuck!

Anyway, Good luck, Richardo!

你可能感兴趣的:(Leetcode - 3Sum Closest)