每日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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。