leetcode——二分法
35. 搜索插入位置
难度简单951收藏分享切换为英文接收动态反馈
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
示例 1:
输入: [1,3,5,6], 5
输出: 2
示例 2:
输入: [1,3,5,6], 2
输出: 1
**题解:**对于已经排序好的数组,可以使用二分法, 数组中的元素是按升序排列,将表中间位置记录的值与查找值比较,如果两者相等,则查找成功;否则利用中间位置将数组分成前、后两个子数组,如果中间位置记录的关键字大于查找关键字,则进一步查找前面的数组,否则进一步查找后面的数组。重复以上过程,直到找到满足条件的值,使查找成功。如果查找成功就返回。不能查找成功,则说明已经搜索到数组的尾部了。
public int searchInsert(int[] nums, int target) {
int left=0;
int right=nums.length;
while(left<right)
{
int middle=left + (right - left)/2;
if(nums[middle]==target)
return middle;
else if(nums[middle]<target)
left=middle+1;
else
right=middle;
}
return left;//可能已经遍历到末尾了
}
二分查找的模板,注意边界问题
-
模板一:
right = nums.length - 1;,则使得循环条件为left <= right
class Solution {
public int searchInsert(int[] nums, int target) {
int left = 0, right = nums.length - 1; // 注意
while(left <= right) { // 注意
int mid = (left + right) / 2; // 注意
if(nums[mid] == target) { // 注意
// 相关逻辑,查找到之后的逻辑
} else if(nums[mid] < target) {
left = mid + 1; // 注意
} else {
right = mid - 1; // 注意
}
}
// 相关返回值
return 0;
}
}
-
模板二:
right = nums.length;,则使得循环条件为left < right
class Solution {
public int searchInsert(int[] nums, int target) {
int left = 0, right = nums.length; // 注意
while(left < right) { // 注意
int mid = (left + right) / 2; // 注意
if(nums[mid] == target) {
// 相关逻辑
} else if(nums[mid] < target) {
left = mid + 1; // 注意
} else {
right = mid; // 注意
}
}
// 相关返回值
return left;
}
}