2013년 12월 7일 토요일

3Sum Closest


	public int threeSumClosest(int[] num, int target) {
		if (num == null)
			return target;

		int len = num.length;
		if (len < 3) {
			int sum = 0;
			for (int i = 0; i < len; i++)
				sum += num[i];
			return sum;
		}

		Arrays.sort(num);
		return findClosestSumSorted(num, target, 0, len, 3);
	}

	public int findClosestSumSorted(int[] num, int target, int offSet, int len,
			int numToSum) {
		int loopMax = len - numToSum + 1;
		if (numToSum == 1) {
			int prevBestValue = num[offSet];
			int prevDiff = Math.abs(target - num[offSet]);
			for (int i = offSet + 1; i < loopMax; i++) {
				int currentDiff = Math.abs(target - num[i]);
				if (currentDiff < prevDiff) {
					prevBestValue = num[i];
					prevDiff = currentDiff;
				} else if (currentDiff > prevDiff)
					break;
			}
			return prevBestValue;
		} else {
			int prevBestValue = 0, prevDiff = Integer.MAX_VALUE;
			int lastValue = num[offSet] - 1;
			for (int i = offSet; i < loopMax; i++) {
				if (lastValue == num[i])
					continue;

				lastValue = num[i];
				int newTarget = target - num[i];
				int findValue = findClosestSumSorted(num, newTarget, i + 1,
						len, numToSum - 1);
				int currentDiff = Math.abs(newTarget - findValue);
				if (currentDiff < prevDiff) {
					prevBestValue = num[i] + findValue;
					prevDiff = currentDiff;
				} else if (currentDiff > prevDiff)
					break;
			}
			return prevBestValue;
		}
	}

댓글 없음:

댓글 쓰기