LeetCode 35. 搜索插入位置

35. 搜索插入位置

题目:
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。

链接 https://leetcode.cn/problems/search-insert-position/

个人思路
  1. 看到题目就想使用二分法,首先先解决最简单的情况,也就是当目标数字小于等于列表第一个数或者大于最后一个数时,直接返回插入位置

  2. 接下来考虑其他位置的情况,使用tempLen记录每一次二分后得到的列表长度,这里加上0.5相当于向上取整,使用result标记每一次二分后目标数字target要比较的列表位置,思考二分停止条件:当target小于等于result位置数字,并大于其左边位置数字,则target应插入在result位置

  3. 若大于result位置数字则计算下一次二分得到的长度,即tempLen = int(tempLen / 2 + 0.5),计算在列表中的位置:result = result + tempLen,在左边二分同理

class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        tempLen = int(len(nums)/2+0.5)
        result =  int(len(nums)/2)
        if target > nums[-1]:
            return len(nums)
        elif target <= nums[0]:
            return 0
        else:
            for i in range (int(len(nums)/2+0.5)):
                if target <= nums[result] and target > nums[result-1]:
                    return result
                # 右边二分,计算二分后的长度tempLen,计算新的要比较的数字位置result
                elif target > nums[result]:
                    tempLen = int(tempLen / 2 + 0.5)
                    result = result + tempLen
                # 左边二分
                else:
                    tempLen = int(tempLen / 2 + 0.5)
                    result = result - tempLen
其他思路

看了其他人的题解,感觉我的还是麻烦了,新手

  1. 思路一:
    (1)二分法就是折半查找,先选中间的数,如果目标值比中间值大,去右边找;如果目标值比中间值小,去左边找;直到找到目标或超出了边界条件为止。
    (2)二分法有两种写法,假设n为数组长度,一种是在[0, n - 1]这个左闭右闭区间内找,一种是在[0, n)这个左闭右开区间内找,边界条件稍有不同,选择哪种纯看个人喜好。
    (3)找中间值也有两种写法,一是mid =(left + right)// 2,二是mid = left + (right - left) // 2,后者可以避免直接相加导致的数值溢出,
    代码(左闭右闭):
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:
                right = mid - 1
            else:
                left = mid + 1
        return left

代码(左闭右开)

class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        left = 0
        right = len(nums)
        while left < right:
            mid = left + (right - left) // 2
            if nums[mid] == target:
                return mid
            elif nums[mid] > target:
                right = mid
            else:
                left = mid + 1
        return left

作者:edelweisskoko
链接:https://leetcode.cn/problems/search-insert-position/solution/35-sou-suo-cha-ru-wei-zhi-er-fen-fa-de-l-6dz5/
来源:力扣(LeetCode)

  1. 思路2:
    python有许多库与方法,可以合理利用
class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        nums.append(target)
        nums.sort()
        return nums.index(target)
class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        return bisect.bisect_left(nums, target)

你可能感兴趣的:(LeetCode,leetcode,算法,职场和发展)