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;
}
推荐阅读
- 人工智能|干货!人体姿态估计与运动预测
- 分析COMP122 The Caesar Cipher
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)
- C语言学习(bit)|16.C语言进阶——深度剖析数据在内存中的存储
- Python机器学习基础与进阶|Python机器学习--集成学习算法--XGBoost算法
- 数据结构与算法|【算法】力扣第 266场周赛
- 数据结构和算法|LeetCode 的正确使用方式
- leetcode|今天开始记录自己的力扣之路
- 人工智能|【机器学习】深度盘点(详细介绍 Python 中的 7 种交叉验证方法!)
- 网络|简单聊聊压缩网络