2.LeetCode刷题-搜索插入位置一、题目描述二、题

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

一、题目描述

难度:简单~

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 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)
链接:leetcode-cn.com/leetbook/re…
来源:力扣(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)】!!!为解决这两个问题,必须使用:二分查找

二分查找:

  1. left=0,right=numsSize,取mid为中间值
  2. 每次根据nums[mid]和target之间的大小进行判断,相等则直接返回下标,nums[mid] < target则left = mid + 1,nums[mid] > target,则right = mid - 1.
  3. 查找结果如果没有相等则返回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
复制代码

🔆In The End!

请添加图片描述

从现在做起,坚持下去,一天进步一小点,不久的将来,你会感谢曾经努力的你!

本博主会持续更新爬虫基础分栏及爬虫实战分栏,认真仔细看完本文的小伙伴们,可以点赞收藏并评论出你们的读后感。并可关注本博主,在今后的日子里阅读更多爬虫文!

如有错误或者言语不恰当的地方可在评论区指出,谢谢!
如转载此文请联系我征得本人同意,并标注出处及本博主名,谢谢 !