Leetcode 算法题 35
题名:Search Insert Position
https://leetcode.com/problems/search-insert-position/?tab=Description
题目描述:给定一个排序后的数组array和一个目标值target,如果target在array中出现的话,就返回其在array中的索引,如果没有的话就返回其在array中按顺序插入的话应该插入的位置。假定数组中没有重复的元素
解题思路:这是一个典型的二分查找的问题,二分查找要求数组有序,二分查找的思想是每次查找指定数组中间节点的值,将其和target进行比较,如果命中则返回其索引,如果中间节点的值比target大,则将指定数组往左转移,即查找左边的数组,如果中间节点的值比target小,则查找右边的数组。
Tips:对于没有命中的情况,由于中止了循环,意味着指定数组的右指针往左偏移超过了左指针,因此可以返回右节点加1的值作为target的索引值。
返回mid+1也可以,原因在于,通常在进行比较的时候比较到最后如果没有查找到的话只剩下一个元素则left=right,且nums[mid] 大于target,至于为什么大于,往上退一步到还剩两个元素时进行比较就知道了。此时right执行减一操作,而此时right的位置恰恰为target应该插入的节点的位置,因此返回时应返回right+1,同理返回mid+1或者left也可
Python代码如下
class Solution(object):
def searchInsert(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
left = 0
right = len(nums) - 1
mid = (left + right) / 2
while left <= right:
if nums[mid] == target:
return mid
elif nums[mid] > target:
right = mid - 1
mid = (left + right) / 2
elif nums[mid] < target:
left = mid + 1
mid = (left + right) / 2
return right + 1