其他
Binary Search 面试最常考题(下)
先判断这边是不是 sorted 的:array[left] <= array[mid],必须写等号,因为mid可能等于left 在 sorted 的那边,判断 target 是否在这个区间内,相应的移动左右指针
// return index
class Solution {
public int search(int[] nums, int target) {
if(nums == null || nums.length == 0) {
return -1;
}
int left = 0;
int right = nums.length - 1;
while(left <= right) {
int mid = left + (right - left)/2;
if(nums[mid] == target) {
return mid;
}
if(nums[left] <= nums[mid]) { // left part is sorted
if(target >= nums[left] && target <= nums[mid]) { // target is in the left part
right = mid - 1;
} else {
left = mid + 1;
}
} else { // right part is sorted
if(target >= nums[mid] && target <= nums[right]) { // target is in the right part
left = mid + 1;
} else {
right = mid - 1;
}
}
}
return -1; // does not find
}
}
class Solution {
public boolean search(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while(left <= right) {
int mid = left + (right - left)/2;
if(nums[mid] == target) {
return true;
}
if(nums[mid] == nums[right]) { // mid不是target,所以right也不是
right--;
} else if(nums[mid] < nums[right]) {
if(target >= nums[mid] && target <= nums[right]) {
left = mid + 1;
} else {
right = mid - 1;
}
} else {
if(target >= nums[left] && target <= nums[mid]) {
right = mid - 1;
} else {
left = mid + 1;
}
}
}
return false;
}
}