2.LeetCode刷题-搜索插入位置
这是我坚持力扣刷题打卡的第2/100题~
一、题目描述
难度:简单~ |
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 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
示例5:
输入: nums = [1], target = 0输出: 0
提示:
1 <= nums.length <= 10^4
-10^4 <= nums[i] <= 10^4
nums 为无重复元素的升序排列数组
-10^4 <= target <= 10^4
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/array-and-string/cxqdh/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
二、题目解析
思路:
直接代码里注释!
三、代码
1.C实现
暴力遍历:
分两部分:
第一部分:如果target小于等于数组中的值,直接return;
第二部分:如果全部遍历完证明target是最大的数,直接插入末尾,即返回数组长度即可。
int searchInsert(int* nums, int numsSize, int target){ for(int i = 0;i < numsSize; i++){if(target <= nums[i])return i;}return numsSize;}
缺点:数值较多时,没有那么高效,而且没有满足题目中的时间复杂度要求【此暴力遍历时间复杂度为O(N)】!!!为解决这两个问题,必须使用:二分查找 |
二分查找:
- left=0,right=numsSize,取mid为中间值
- 每次根据nums[mid]和target之间的大小进行判断,相等则直接返回下标,nums[mid] target,则right = mid - 1.
- 查找结果如果没有相等则返回left, 该值为插入位置。
时间复杂度为:O(logN),因为每次循环都会丢弃一半的查找空间。
int pivotIndex(int* nums, int numsSize) { int left = 0, right = numsSize-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 if(nums[mid] > target)right = mid - 1;}return left;}
2.C++实现
实现上述二分查找。
class Solution {public: int searchInsert(vector<int>& nums, int target) { int left=0,right=nums.size()-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; }};
3.Python实现
实现上述二分查找。
class Solution: def searchInsert(self, nums: List[int], target: int) -> int: left = 0 right = len(nums) - 1 while(left <= right): mid = (left + right) // 2 # // 为向下取整 if(nums[mid] == target): return mid elif(nums[mid] < target): left = mid + 1 else: right = mid - 1 return left