数据结构--查找
查找
二分法查找
from time import perf_counter
from typing import List
def my_min(arr: List[int]):
"""
二分查找法
:param arr: 已知有序数组
:return: list数列
"""
length = len(arr)
if length <= 0:
return None
index1 = 0
index2 = length - 1
while arr[index2] >= arr[index1]:
if index2 - index1 == 1:
index_mid = index2
break
index_mid = int((index2 + index1) / 2)
if arr[index_mid] >= arr[index1]:
index1 = index_mid
elif arr[index_mid] <= arr[index2]:
index2 = index_mid
return arr[index_mid]
** 面试题型
eg:
题目:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的
一个旋转,输出旋转数组的最小元素。例如:数组[3,4,5,1,2]为[1,2,3,4,5]的一个旋转,该数组最
小值为1.
from time import perf_counter
from typing import List
def my_min(arr: List[int]):
"""
二分查找法
:param arr: 有序数列部分反转之后的数列
:return: list数列
"""
length = len(arr)
if length <= 0:
return None
index1 = 0
index2 = length - 1
while arr[index2] >= arr[index1]:
if index2 - index1 == 1:
index_mid = index2
break
index_mid = int((index2 + index1) / 2)
# 当index1,index2,index_mid索引对应的数列的值相同时,只能顺序查找
if arr[index1] == arr[index2] and arr[index1] == arr[index_mid]:
return min_in_order(arr, index1, index2)
if arr[index_mid] >= arr[index1]:
index1 = index_mid
elif arr[index_mid] <= arr[index2]:
index2 = index_mid
return arr[index_mid]
def min_in_order(arr):
"""
:param arr: 一维数组
:retrun: 获取最小值
"""
if len(arr) <= 0:
return None
res = arr[0]
for i in arr:
if i < res:
res = i
return res
** 总结
考察二分查找的理解,变换了二分查找的条件(输入的数组不是有序的)