zoukankan      html  css  js  c++  java
  • 35搜索插入位置

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

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

    法一:

    思路:两种方法,一种是左闭右闭,另一种是左闭右开,由于区间的不同导致了最后用mid划分区间的不同,

    from typing import List
    class Solution:
        def searchInsert(self, nums: List[int], target: int) -> int:
            size = len(nums)
            if size == 0:
                return 0
            left = 0
            # 因为有可能数组的最后一个元素所在位置的下一个是我们要找的,故右边界是 len
            right = size
            # 注意这里是左闭右开
            while left < right:
                mid = (left + right) >> 1
                # 严格小于 target 的元素一定不是解
                if nums[mid] < target:
                    # 下一轮搜索区间是 [mid + 1, right]
                    left = mid + 1
                # 如果等于目标值,直接返回索引
                elif nums[mid] == target:
                    return mid
                # 由于是左闭右开,所以mid虽然已经判断过了,但右边取mid,因为右边是开区间
                elif nums[mid] > target:
                    right = mid
                # # 或者直接
                # else:
                #     right = mid
            # 如果left等于right了,一定是target不在nums中,且nums[left-1] < target,所以应该返回left
            return left
    
    from typing import List
    class Solution:
        def searchInsert(self, nums: List[int], target: int) -> int:
            left = 0
            right = len(nums) - 1
            while left <= right:
                mid = (left + right) >> 1
                if nums[mid] == target:
                    return mid
                elif nums[mid] > target:
                    right = mid - 1
                elif nums[mid] < target:
                    left = mid + 1
            print(left, right)
            # 结束while循环时的上一步是left等于right
            # 如果最后一步执行的是right = mid - 1,则说明nums[left-1]<target,而nums[left]>target,所以应该返回left
            # 如果最后一步执行的是left = mid + 1,则说明nums[right]<target,而nums[right+1]>target,并且循环结束时,left=right+1,所以返回left,
            return left
    if __name__ == '__main__':
        solution = Solution()
        # result = solution.searchInsert([1,3,5,6], 6)
        result = solution.searchInsert([1,3,5,6], -1)
        # result = solution.searchInsert([1], 0)
        print(result)
    View Code

    ttt

  • 相关阅读:
    汇编 | 寄存器内存访问内存中字的存储
    机器学习 | 鸢尾花分类项目实战
    机器学习 | 剖析感知器算法 & Python实现
    机器学习 | 机器学习简介
    用 shell 脚本做命令行工具扩展
    基于预计算的实时环境光照(Real-time Environment Lighting Based On Precomputation)
    Java-jvm调优文档摘要
    Probius+Kubernetes任务系统如虎添翼
    Django+Ansible构建任务中心思路
    【多线程】Android多线程学习笔记——线程池
  • 原文地址:https://www.cnblogs.com/xxswkl/p/12344840.html
Copyright © 2011-2022 走看看