我的LeetCode代码仓:https://github.com/617076674/LeetCode
原题链接:https://leetcode-cn.com/problems/search-insert-position/description/
题目描述:
知识点:二分搜索法
思路一:floor函数实现
本题的解法和 LeetCode034——在排序数组中查找元素的第一个和最后一个位置一模一样,其实只需要一半过程即可。任意用floor函数或者ceil函数实现均可。
(1)令left的初始值为-1,right的初始值为nums.length - 1。
(2)当left < right时进行以下循环,
a.计算mid时,为了防止死循环的出现,需要向上取整。
b.当target小于等于nums[mid]时,我们应该在左半部分寻找,令right = mid - 1。当target大于nums[mid]时,我们应该在右半部分寻找,令left = mid。
(3)结束循环后,直接返回left + 1。因为不管在nums数组中找没找到target值,我们返回的都是left + 1。
时间复杂度是O(logn)级别的,空间复杂度是O(1)级别的。
JAVA代码:
public class Solution {
public int searchInsert(int[] nums, int target) {
int left = -1;
int right = nums.length - 1;
while(left < right) {
int mid = left + (right - left + 1) / 2;
if(target <= nums[mid]) {
right = mid - 1;
}else {
left = mid;
}
}
return left + 1;
}
}
LeetCode解题报告:
思路二:ceil函数实现
(1)令left的初始值为0,right的初始值为nums.length。
(2)当left < right时进行以下循环,
a.计算mid时,为了防止死循环的出现,需要向下取整。
b.当target大于等于nums[mid]时,我们应该在右半部分寻找,令left = mid + 1。当target小于nums[mid]时,我们应该在左半部分寻找,令right = mid。
(3)结束循环后的判断比floor函数要稍微复杂一些。如果索引left - 1不越界,且nums[left - 1]的值为target,说明我们在数组nums中找到了target值,其索引为left - 1,直接返回left - 1。否则,说明没找到target值,我们返回left。
时间复杂度是O(logn)级别的,空间复杂度是O(1)级别的。
JAVA代码:
public class Solution {
public int searchInsert(int[] nums, int target) {
int left = 0;
int right = nums.length;
while(left < right) {
int mid = left + (right - left) / 2;
if(target >= nums[mid]) {
left = mid + 1;
}else {
right = mid;
}
}
if(left - 1 >= 0 && nums[left - 1] == target) {
return left - 1;
}else {
return left;
}
}
}
LeetCode解题报告: