LeetCode刷题记录----35.搜索插入位置(Easy)
2025/8/28
题目(Easy):
我的思路:
因为要求时间复杂度为O(log n),因此自然联想到折半查找。即定义左右边界 left,right,根据它们中间的mid = (left+right)/2(向下取整)索引位置和target值的大小,来逐步缩小搜索的区间。
最后如果没有检索到目标值的话,插入的位置就是left指针当前指向的位置。因为如果最后mid处的值大于target的话,那应该插入位置为mid;如果mid处的值小于target的话,那应该插入位置为mid+1的位置。而这两个位置正好也都对应两种情况下left指针的位置,因此正好返回left;
具体代码如下:
class Solution {
public:int searchInsert(vector<int>& nums, int target) {//二分查找了int left = 0;int right = nums.size()-1; //确定好左右边界int mid = 0;while(left <= right){mid = left + (right - left) / 2;if(nums[mid] == target){return mid;}else if(nums[mid] > target){right = mid - 1;}else if(nums[mid] < target){left = mid + 1;}}//return nums[mid] > target ? mid : mid+1;return left; //如果target 比 mid 位置小,那么mid和left会在同一位置;如果Target比mid大,那么最后left 还会 = mid + 1;和上面的表达式结果一致}
};
时间复杂度:O(log n)
空间复杂度:O(1)
总结:
①对于要求时间复杂度简化到O(logN)的有序数组中的检索,可以想到用折半查找
②对于最后没有找到需要插入的位置,正好插入 left指针指向的位置