LeetCode035——搜索插入位置

本文详细介绍了LeetCode第35题“搜索插入位置”的两种解法:使用floor函数和ceil函数实现的二分搜索法。这两种方法都能有效地解决在已排序数组中查找特定值并确定插入位置的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我的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解题报告:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值