一 整体有序
- leedcode35:搜索插入位置
- leedcode34:查找元素的第一个位置和最后一个位置
- leedcode74:搜索二维矩阵
- 小于target最后位置:nums[mid]==target -> right移动 -> return right
- 大于target起始位置:nums[mid]==target -> left移动 -> return left
- 等于target起始位置与终止位置与小于大于一致,仅需改变return即可
// 大于target的起始位置
public int searchRight(int[] nums, int target){
int left = 0, right = nums.length - 1;
while(left <= right){
int mid = (left + right) / 2;
if(nums[mid] > target){
right = mid - 1;
}else{
left = mid + 1;
}
}
return left;
}
// 小于target的最后位置
public int searchLeft(int[] nums, int target){
int left = 0, right = nums.length - 1;
while(left <= right){
int mid = (left + right) / 2;
if(nums[mid] < target){
left = mid + 1;
}else{
right = mid - 1;
}
}
return right;
}
二 旋转排序数组
- leedcode33:搜索旋转排序数组(不含重复元素)
核心思想:
- 确定有序的一半:nums[left] <= nums[mid],左半边有序,否则右半边有序
- 判断target是否在有序的一半中,移动指针
if(nums[mid] == target){
return mid;
}
if(nums[mid] >= nums[left]){
// 记得等于号
if(nums[left] <= target && nums[mid] > target){
right = mid - 1;
}else{
left = mid + 1;
}
}else{
if(nums[mid] < target && nums[right] >= target){
left = mid + 1;
}else{
right = mid - 1;
}
}
- leedcode81:搜索旋转排序数组(含重复元素)
if(nums[mid] == nums[left]){
left++;
continue;
}
- leedcode153:寻找旋转排序数组的最小值(不含重复元素)
while(left < right){
int mid = (left + right) / 2;
if(nums[mid] < nums[right]){
// 保证区间一直包含最小值
right = mid;
}else if(nums[mid] > nums[right]){
left = mid + 1;
}
}
return nums[left];
- leedcode154:寻找旋转排序数组的最小值(含重复元素)
if(nums[mid] == nums[right]){
right--;
}