数据结构--查找

查找

二分法查找

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

** 总结
考察二分查找的理解,变换了二分查找的条件(输入的数组不是有序的)

posted @ 2022-03-29 18:41  酷酷的排球  阅读(58)  评论(0编辑  收藏  举报