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;
}
}
2013년 12월 7일 토요일
3Sum Closest
피드 구독하기:
댓글 (Atom)
댓글 없음:
댓글 쓰기