您的位置:首页 > 其它

LeetCode:3Sum Closest

2013-08-27 19:20 239 查看
前两个数遍历,最后一个数使用二分搜索。时间复杂度O(N*N*logN).

这题可能是我没想明白,边界条件没处理好,弄了半天。脑子不好使。

import java.util.Arrays;

public class L3SumClosest {
	public static void main(String[] args) {
		L3SumClosest l = new L3SumClosest();
		int[] num = new int[3];
		num[0] = 0;
		num[1] = 1;
		num[2] = 2;
		int m = l.threeSumClosest(num, 0);
		System.out.println(m);
	}
	 public int threeSumClosest(int[] num, int target) {
		Arrays.sort(num);
		
		int min = Integer.MAX_VALUE;
		int sum = 0;
		for (int i = 0; i < num.length - 1; i++) {
			for (int j = i + 1; j < num.length - 1; j++) {
				int s = num[i] + num[j];
				
				int k = target - s;
				int index = Arrays.binarySearch(num, k);
				if (index > 0) {
					if (index > j) {
						return target;
					} else {
						int ss = s + num[j + 1];
						if (Math.abs(ss - target) < min) {
							min = Math.abs(ss - target);
							sum = ss;
						}
					}
				} else {
					int ss;
					index = 0 - index - 1;
					if (index > j) {
						if (index == j + 1) {
							ss = s + num[index];
						} else if (index == num.length) {
							ss = s + num[index - 1];
						} else {
							int left = num[index - 1];
							ss = s + left;
							
							int right = num[index];
							int sss = s + right;
							if (Math.abs(ss - target) > Math.abs(sss - target)) {
								ss = sss;
							}
						}
						
						//System.out.println(ss);
						if (Math.abs(ss - target) < min) {
							min = Math.abs(ss - target);
							sum = ss;
						}
					} else {
						int sss = s + num[j + 1];
						if (Math.abs(sss - target) < min) {
							min = Math.abs(sss - target);
							sum = sss;
						}
					}
				}
			}
		}
		
		return sum;

	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: