Leetcode二分查找算法

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;
}

你可能感兴趣的:(算法)