最原始的方法:

public class Solution {
    public int threeSumClosest(int[] nums, int target) {
        int len = nums.length;
        if(len < 2) return 0;
        int i = 0;
        int sum = nums[0]+nums[1]+nums[2];
        int minDiff = sum - target;
        minDiff = minDiff < 0? (-1)*minDiff: minDiff;
        if(minDiff == 0) return sum;
        while(i < len - 2){
            for(int j = i + 1; j < len-1; j++){
                for(int k = j + 1; k < len; k++){
                    int temp = nums[i] + nums[j] + nums[k];
                    int diff = temp - target;
                    diff = diff < 0? (-1)*diff : diff;
                    if(diff == 0) return temp;
                    if(diff < minDiff){
                        minDiff = diff;
                        sum = temp;
                    }
                }
            }
            i++;
        }
        return sum;
    }
}

  思维盲区,对原数组进行操作,其实只要题目没要求保留数组不变,我们可以先对数组排序(or other operation),这样数组不再是随机排列,查找起来就方便很多。Runtime 变为O(n^2);

代码:

public class Solution {
    public int threeSumClosest(int[] nums, int target) {
        Arrays.sort(nums);
        int len = nums.length;
        int i = 0;
        int sum = nums[0]+nums[1]+nums[2];
        int minDiff = sum - target;
        minDiff = minDiff < 0? (-1)*minDiff: minDiff;
        if(minDiff == 0) return sum;
        while(i < len - 2){
            int low = i + 1;
            int high = len - 1;
            while(low < high){
                int temp = nums[i] + nums[low] + nums[high];
                if(temp == target) return target;
                while(low < high && temp < target){
                    int diff = temp - target;
                    diff = diff < 0? (-1)*diff : diff;
                    if(diff < minDiff){
                        minDiff = diff;
                        sum = temp;
                    }
                    low++;
                    temp = nums[i] + nums[low] + nums[high];
                }
                while(low < high && temp > target){
                    int diff = temp - target;
                    diff = diff < 0? (-1)*diff : diff;
                    if(diff < minDiff){
                        minDiff = diff;
                        sum = temp;
                    }
                    high--;
                    temp = nums[i] + nums[low] + nums[high];
                }
                
            }
            i++;
        }
        return sum;
    }
}

  

posted on 2016-01-15 11:32  爱推理的骑士  阅读(119)  评论(0编辑  收藏  举报