【Python3】搜索插入位置——力扣每日一题(五)(2020.07.17)

目录

  • 题目:35. 搜索插入位置
  • 思路
    • 方法一:暴力
    • 方法二:二分法

如果你从本文中学习到丝毫知识,那么请您点点关注、点赞、评论和收藏
大家好,我是爱做梦的鱼,我是东北大学大数据实验班大三的小菜鸡,非常渴望优秀,羡慕优秀的人,个人博客为:爱做梦的鱼https://zihao.blog.csdn.net/,微信公众号、微信视频号为【程序猿干货铺】,qq交流群为:1107710098,
程序猿干货铺

如果你同样热爱算法,那么请关注我,我将每日更新力扣的每日一题的题解+代码,每周更新力扣周赛题解+代码
《本题JAVA代码版》
专栏《力扣每日一题》
专栏《力扣周赛》
专栏《力扣大厂模拟面试算法题》

题目:35. 搜索插入位置

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

示例 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 = nums[pos]
  2. 目标值不存在于数组中,返回它将会被按顺序插入的位置。
    1. 普遍情况,公式二:nums[pos−1] < target < nums[pos] 返回的索引为pos[1,n-1]
    2. 边界情况一targer < nums[0] 返回的索引为0
    3. 边界情况二target > nums[n-1] 返回的索引为n

合并公式一二,可以得出我们本题的公式三(普遍情况)公式三:nums[pos−1] < target <= nums[pos]
「在一个有序数组中找第一个大于等于target 的下标」 (本题中提示:你可以假设数组中无重复元素。)
最终公式为,两种边界情况+公式三
targer < nums[0] 返回的索引为0
target > nums[n-1] 返回的索引为n
nums[pos−1] < target <= nums[pos] 返回的索引为pos[1,n-1]

方法一:暴力

from typing import List

class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        n = len ( nums )
        # 一、先考虑边界情况
        if target <= nums[0]:
            return 0
        if target > nums[n - 1]:
            return n
        # 二、后考虑普遍情况
        for i in range ( 1, n ):
            if nums[i - 1] < target <= nums[i]:
                return i


nums1 = [1, 3, 5, 6]
print ( Solution ().searchInsert ( nums1, 5 ) )
print ( Solution ().searchInsert ( nums1, 0 ) )
print ( Solution ().searchInsert ( nums1, 7 ) )

简化代码

    def searchInsert(self, nums: List[int], target: int) -> int:
        n = len ( nums )
        for i in range ( n ):
            if target <= nums[i]:
                return i
        return n

复杂度分析

  • 时间复杂度:O(n),其中 n 为数组的长度。

  • 空间复杂度:O(1)。我们只需要常数空间存放若干变量。
    【Python3】搜索插入位置——力扣每日一题(五)(2020.07.17)_第1张图片

方法二:二分法

代码

import math
from typing import List


class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        n = len ( nums )
        left = 0
        right = n - 1
        ans = n
        while left <= right:
            middle = math.floor ( (left + right) / 2 )  # 向下取整
            if target <= nums[middle]:
                ans = middle
                right = middle - 1
            else:
                left = middle + 1

        return ans


nums1 = [1, 3, 5, 6]
print ( Solution ().searchInsert ( nums1, 5 ) )
print ( Solution ().searchInsert ( nums1, 0 ) )
print ( Solution ().searchInsert ( nums1, 7 ) )

复杂度分析

  • 时间复杂度:O(logn),其中 n 为数组的长度。二分查找所需的时间复杂度为 O(logn)。

  • 空间复杂度:O(1)。我们只需要常数空间存放若干变量。
    【Python3】搜索插入位置——力扣每日一题(五)(2020.07.17)_第2张图片

非常建议大家去看官方题解
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/search-insert-position/solution/sou-suo-cha-ru-wei-zhi-by-leetcode-solution/
来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(#,力扣每日一题,算法,二分法,数据结构,python,leetcode)