LeetCode-数组__35. 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素
-
输入: [1,3,5,6], 2
-
输出: 1
-
输入: [1,3,5,6], 7
-
输出: 4
package LeetCode.Array.e35_搜索插入位置;
/**
* 35. 搜索插入位置
* 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,
* 返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。
*输入: [1,3,5,6], 5
* 输出: 2
*
* 输入: [1,3,5,6], 2
* 输出: 1
*
* 输入: [1,3,5,6], 7
* 输出: 4
*
* [1,2,7,13,15] target=8
*/
// 递归法
public class SearchInsertPosition {
public static int searchInsert(int[] arr,int target,int low,int high){
//此处非常关键,当target不在数组当中的时候,此时的返回值应该是它插入的位置的index
//当查不到target,那么递归会返回最后一次遍历,只有一个元素待查找即13
//上一次返回的是[arr,8,0,-1] 因为上次middle=0,故middle-1=-1,low>high,返回low的位置即插入的位置
if(low > high){
return low;
}
//剩余步骤和二分法相同
int middle = (low + high)/2;//为了更加高效:int middle = (low + high) >> 1;
if(arr[middle] > target){
return searchInsert(arr,target,low,middle-1);
}else if(arr[middle] < target){
return searchInsert(arr,target,middle+1,high);
}else{
return middle;
}
}
// while循环法
public static int whileSearchInsert(int[] arr,int target){
if(arr.length == 0 || arr[0] > target)
return 0;
if(arr[arr.length - 1] < target)
return arr.length;
int low = 0;
int high = arr.length - 1;
int mid = 0;
while(low < high){
mid = (low + high)/2;
if(arr[mid]<target){
low = mid + 1;
}else if (arr[mid] > target){
high = mid - 1;
}else {
return mid;
}
}
//核心所在:如果找到,即返回
//找不到再判断 target 与 nums[mid] 大小,返回索引
return arr[mid] > target?mid:mid+1;
}
public static void main(String[] args) {
int[] arr = {1,3,5,6};
System.out.println(whileSearchInsert(arr,8));
// System.out.println(searchInsert(arr,8,0,arr.length-1));
}
}