• python面试题 【二分法查找】给定一个已排序的非重复整数数组和一个目标值,如果找到目标,则返回索引。 上海


    前言

    给定一个已排序的非重复整数数组和一个目标值,如果找到目标,则返回索引。如果不是,返回索引按顺序插入时的位置。

    题目

    给定一个已排序的非重复整数数组和一个目标值,如果找到目标,则返回索引。如果不是,返回索引按顺序插入时的位置。
    (用二分法查找解决)
    示例 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

    二分法查找

    二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,二分查找的时候一定要是有序的数组。

    二分法思想
    1.首先从数组的中间元素开始查找,如果该元素正好是目标元素,则搜索结束,否则执行下一步。
    2.如果目标元素大于/小于中间元素,则在数组大于/小于中间元素的那一半区域查找,然后重复步骤1的操作。
    3.如果某一步数组为空,则表示找不到目标元素

    如下图,数组中有目标元素,查找21

    如下图,数组中没有目标元素,查找70

    直到 low > high 查找失败

    python3 二分法查找

    python3 代码示例

    from typing import List
    
    
    class Solution:
        """
        二分法查找
        """
        def searchInsert(self, nums: List[int], target: int) -> int:
            low, high = 0, len(nums) - 1
            while low <= high:
                mid = low + (high-low) // 2
                if nums[mid] == target:
                    return mid
                elif nums[mid] < target:
                    low = mid + 1
                else:
                    high = mid - 1
            return low  # 没找到则返回其位置左边的下标, 即为它按顺序插入的位置
    
    
    if __name__ == '__main__':
        res1 = Solution().searchInsert([1, 3, 5, 6], 5)
        print(res1)
        res2 = Solution().searchInsert([1, 3, 5, 6], 7)
        print(res2)
    

    以目标值为7示例
    第一轮比较,mid 中间位置是数字3

    target目标值7 大于中间数字3,所以第二轮比较

    target目标值7 大于中间数字5,所以第三轮比较

    由于第三轮比较target目标值7 大于中间数字6,此时low=mid=high了,依然满足while low <= high,所以还会有下一轮比较
    此时low = mid + 1 循环结束,最终返回左边的下标 low

    参考博客https://blog.csdn.net/weixin_43511031/article/details/122494815

  • 相关阅读:
    国内乡村安防全面建设仍需推进,EasyNVR/EasyGBS/EasyCVR平台助力治安防控
    TSINGSEE青犀视频播放视频流的编码格式和封装格式有什么关系?
    全景摄像头怎么接入网页进行视频直播?
    EasyNTS编译报错could not read Username for XXXXX
    【LOJ#3005】Limited Memory
    【BZOJ2407】探险
    【洛谷P4480】餐巾计划问题
    【CF163E】e-Government
    【洛谷P4332】三叉神经树
    【洛谷P7518】宝石
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/16472052.html
Copyright © 2020-2023  润新知