704. 二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
示例 1:
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
示例 2:
输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1
求中点位置:
int mid=L+((R-L)>>1);
非递归实现:
public int search(int[] nums, int target) {
if(nums==null){
return -1;
}
int L=0;
int R=nums.length-1;
while(L<=R){
int mid=L+((R-L)>>1);
if(nums[mid]==target){
return mid;
}else if(nums[mid]<target){
L=mid+1;
}else{
R=mid-1;
}
}
return -1;
}
递归实现:
class Solution {
public int search(int[] nums, int target) {
if(nums==null){
return -1;
}
return process(nums,target,0,nums.length-1);
}
//在L....R位置上求等于target值的位置
public int process(int[] nums,int target,int L,int R){
//base case
if(L>R){
return -1;
}
int mid=L+((R-L)>>1);
if(nums[mid]==target){
return mid;
}else if(nums[mid]<target){
return process(nums,target,mid+1,R);
}else{
return process(nums,target,L,mid-1);
}
}
}
搜索 nums 中的 target最左的位置
示例:[1,2,2,2,2,3,3,4,4,5,6] target=2
思路:二分的扩展,一直二分到边界结束
当有遇到等于target的位置时,记录一下这个位置,再继续往左二分,返回记录的位置就是等于指定值的最左位置
class Solution {
public int search(int[] nums, int target) {
if(nums==null){
return -1;
}
return process(nums,target,0,nums.length-1,-1);
}
//在L....R位置上求等于target值出现的最左位置
public int process(int[] nums,int target,int L,int R,int flag){
if(L>R){
return flag;
}
int mid=L+((R-L)>>1);
if(nums[mid]>=target){
if(nums[mid]==target){
flag=mid;
}
flag = process(nums,target,L,mid-1,flag);
}else{
flag=process(nums,target,mid+1,R,flag);
}
return flag;
}
}
搜索 nums 中的 target最右的位置
示例:[1,1,1,2,3,3,4,4,4,4,5] target=4
思路:二分的扩展,一直二分到边界结束
当有遇到等于target的位置时,记录一下这个位置,再继续往左二分,返回记录的位置就是等于指定值的最左位置
class Solution {
public int search(int[] nums, int target) {
if(nums==null){
return -1;
}
return process(nums,target,0,nums.length-1,-1);
}
//在L....R位置上求等于target值出现的最右位置
public int process(int[] nums,int target,int L,int R,int flag){
if(L>R){
return flag;
}
int mid=L+((R-L)>>1);
if(nums[mid]<=target){
if(nums[mid]==target){
flag=mid;
}
flag=process(nums,target,mid+1,R,flag);
}else{
flag=process(nums,target,L,mid-1,flag);
}
return flag;
}
}

浙公网安备 33010602011771号