每日LeetCode 搜索插入位置

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

你可以假设数组中无重复元素。

示例 1:

输入: [1,3,5,6], 5
输出: 2


示例 2:

输入: [1,3,5,6], 2
输出: 1


示例 3:

输入: [1,3,5,6], 7
输出: 4


示例 4:

输入: [1,3,5,6], 0
输出: 0

解决方案:


 

1、我想大部分同学的思路基本是直接开始遍历,开始查找target了。对于不在list的数,首先将list排好序,遍历list,并找出其中刚好大于target的值,插在其前面。代码如下:

 1 class Solution:
 2     def searchInsert(self, nums: List[int], target: int) -> int:
 3         if target in nums:
 4             return nums.index(target)
 5         else:
 6             nums.sort()
 7             l = 0
 8             for r in nums:
 9                 if target < r:
10                     nums.insert(l, target)
11                 l += 1
12             return l

  该代码是可以实现上述功能的,但是我在提交时出现了超出运行时间的结果,主要早在于遍历这一项,遍历的时间复杂度为O(N),然而又在循环中使用了insert()函数,该函数的时间复杂度为O(N),使得该方法的时间复杂都成倍增长,因此并不是一个非常好的算法。

2、使用二分思想来解决:

  二分思想,即一次取两个值(一般为端点值),通过不断的判断target是否在两个值之间来缩小范围,直至找到该值。代码如下:

 1 class Solution:
 2     def searchInsert(self, nums: List[int], target: int) -> int:
 3         size = len(nums)
 4         if size == 0:
 5             return 0
 6         left = 0
 7         right = size
 8         while left < right:
 9             mid = (left + right) // 2
10             if nums[mid] < target:
11                 left = mid + 1
12             else:
13                 right = mid
14         return left

 

 

 

 


 

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-insert-position
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

posted @ 2020-08-23 22:36  ASTHNONT  阅读(131)  评论(0编辑  收藏  举报