如何优化基础建站南京做网站seo
LeetCode 35.搜索插入位置
题目描述
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用 O(log n) 的时间复杂度来实现。
示例 1:
输入: nums = [1,3,5,6], target = 5
输出: 2
示例 2:
输入: nums = [1,3,5,6], target = 2
输出: 1
示例 3:
输入: nums = [1,3,5,6], target = 7
输出: 4
示例 4:
输入: nums = [1,3,5,6], target = 0
输出: 0
Java 实现代码
public class Solution {public int searchInsert(int[] nums, int target) {int left = 0, right = nums.length - 1;while (left <= right) {int mid = left + (right - left) / 2;if (nums[mid] == target) {return mid;} else if (nums[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return left;}
}
解题思路
二分查找: 由于题目要求时间复杂度为 O(log n),可以使用二分查找算法。通过不断缩小查找区间,确定目标值的位置或其插入位置。
算法步骤:
- 初始化
left和right指针,分别指向数组的起始和结束位置。- 计算中间位置
mid。- 判断
nums[mid]是否等于目标值:
- 如果等于,直接返回
mid。- 如果小于目标值,移动左指针
left = mid + 1。- 如果大于目标值,移动右指针
right = mid - 1。- 最终,当
left > right时,返回left作为目标值的插入位置。
复杂度分析
- 时间复杂度:O(log n),其中 n 是数组的长度。二分查找每次都将搜索范围减半,因此时间复杂度是对数级别的。
- 空间复杂度:O(1)。我们只使用了常量级别的额外空间来存储指针和中间变量。
执行过程示例
以
nums = [1,3,5,6],target = 2为例:
- 初始化:
left = 0,right = 3- 第一次迭代:
- 计算
mid = 1((0 + 3) / 2)- 比较
nums[mid] = 3和target = 2nums[mid] > target,移动右指针:right = mid - 1 = 0- 第二次迭代:
- 计算
mid = 0((0 + 0) / 2)- 比较
nums[mid] = 1和target = 2nums[mid] < target,移动左指针:left = mid + 1 = 1- 退出循环,返回
left = 1,即插入位置。
