033.Find K Pairs with Smallest Sums
Description
Solution
其实这题很简单,就一个坑
首先,写个binary search,如下
private static int binarySearch(final int[] nums, final int target, int left, int right) {
while (left <= right) {
final int mid = (right - left) / 2 + left;
if (nums[mid] == target) {
return mid;
} else if (target > nums[mid]) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}
这个是狠robust的写法,可以handle left > right
的情况,
然后写主方程
private static int search(final int[] nums, final int target, int left, int right) {
if (left > right) {
return -1;
}
if (left == right) {
return target == nums[left] ? left : -1;
}
final int mid = (right - left) / 2 + left;
if (nums[mid] > nums[right]) { //TODO: 应该是nums[left] 还是right
// left side sorted
if (nums[left] <= target && target <= nums[mid]) {
return binarySearch(nums, target, left, mid);
} else {
return search(nums, target, mid + 1, right);
}
} else {
if (nums[mid] <= target && target <= nums[right]) {
return binarySearch(nums, target, mid, right);
} else {
return search(nums, target, left, mid - 1);
}
}
}
在todo那一行,应该是nums[mid] > nums[right]
还是nums[mid] > nums[left]
?
- 首先,我们的第一个method可以处理任何情况,
- 而第二个method不能处理
left > right
的关系 - 那么当
[3,1]
时,如果target
是1
,那么我们希望剩下一个元素的时候交给binary search
处理,而不是search