题目1. 旋转数组的二分查找
https://leetcode.com/problems/search-in-rotated-sorted-array/
题目简介:一个有序数组,但是经过了旋转, 给一个数字,找到这个数字在数组中位置。
题解:标准二分查找
class Solution {
public int search(int[] nums, int target) {
if(nums.length == 0 )return -1;
int start = 0;
for(int i=1;i<nums.length;i++){
if(nums[i] < nums[i-1]){
start = i;
break;
}
}
System.out.println(start);
if(start ==0){
return partion(nums,0,nums.length-1,target); //注意,传入的是 nums.length-1
}else{
int index = partion(nums,start,nums.length-1,target);
return index == -1 ?partion(nums,0,start-1,target):index;
}
}
int partion(int[] nums,int start,int end,int target){
int left = start;
int right = end;
while(left <= right){ //是小于等于
int mid = left +(right - left)/2;
if(nums[mid] == target){
return mid;
}else if(nums[mid] >target){
right = mid -1; // mid -1
}else {
left = mid+1; // mid +1
}
}
return -1;
}
}
题目2 .二分查找,若没有则找合适的插入位置
https://leetcode.com/problems/search-insert-position/
题目简介:二分查找,若没有则找合适的插入位置
题解:略
class Solution {
public int searchInsert(int[] nums, int target) {
if(nums.length == 0)return 0;
return partion(nums,target);
}
int partion(int[] nums,int target){
int l = 0,r = nums.length-1;
int t = 0;
while(l <= r){
int mid = l +(r-l)/2;
t = mid; //mid就是很好的插入位置,因为最后找不到的话 l和r 必然会集中在最靠近的值那里
if(nums[mid] == target)return mid;
else if(nums[mid] > target){
r = mid -1;
}else{
l = mid +1;
}
}
return target <nums[t] ? t: t+1 ;
}
}