Leetcode二分查找算法

本文介绍了Python中使用二分搜索模块进行高效查找的方法,包括如何定位目标值的起始和结束位置,以及如何在旋转排序数组中搜索目标值。提供了详细的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python的二分搜索模块

#从左边开始找一个位置
bisect.bisect_left(arr, target)
#从右边找到一个位置
bisect.bisect_right(arr, target)
bisect.bisect(arr, target)
#有序插入
bisect.insort(arr, target)

#例:arr:[1,2,2,4,5,6]
bisect_left(arr,2) => 1
bisect_right(arr, 2) => 3

Search for a Range

Given an array of integers sorted in ascending order, find the starting and ending position of a given target value.
Given [5, 7, 7, 8, 8, 10] and target value 8,
return [3, 4].
If the target is not found in the array, return [-1, -1].
Python代码
import bisect
class Solution:
    def searchRange(self, nums, target):
        re1 = bisect.bisect_left(nums,target)
        re2 = bisect.bisect(nums,target)
        if re2 == re1:
            return [-1,-1]
        return [re1, re2-1]

Search in Rotated Sorted Array

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).
You are given a target value to search. If found in the array return its index, otherwise return -1.
You may assume no duplicate exists in the array.
#先找出旋转点
#通过realmid = (mid + rot) % n找出真实的中点
class Solution(object):
    def search(self, nums, target):
        lo, hi = 0, len(nums)-1
        while lo < hi:
            mid = (lo + hi) // 2
            if nums[mid] > nums[hi]:
                lo = mid + 1
            else:
                hi = mid
        rot = lo
        lo, hi = 0, len(nums)-1
        while lo <= hi:
            mid = (hi + hi) // 2
            realmid = (mid + rot) % len(nums)
            if nums[realmid] == target:
                return realmid
            if nums[realmid] < target:
                lo = mid + 1
            else:
                hi = mid - 1
        return -1
public int search(int[] A, int target) {
    int lo = 0;
    int hi = A.length - 1;
    if (hi < 0) {
        return -1;
    }
    while (lo < hi) {
        int mid = (lo + hi) / 2;
        if (A[mid] == target) return mid;

        if (A[lo] <= A[mid]) {
            if (target >= A[lo] && target < A[mid]) {
                hi = mid - 1;
            } else {
                lo = mid + 1;
            }
        } else {
            if (target > A[mid] && target <= A[hi]) {
                lo = mid + 1;
            } else {
                hi = mid - 1;
            }
        }
    }
    return A[lo] == target ? lo : -1;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值