python - 在先递减然后递增且可能包含重复项的列表中查找最小值

标签 python list minimum

给定一个列表,该列表可以分为两部分 L[:z] 和 L[z:],其中第一部分是非递增的,第二部分是非递减的,并且可能包含也可能不包含重复元素,创建一个功能使得:


输入:

  • 上面指定的列表L
  • 一个值 k 表示任何给定值在列表中重复的最大次数

输出:

  • 列表的最小值

复杂性和要求

  • O(log n)
  • 只能使用不包括 min/max 的内置库函数

我有以下内容:

def findmin(L, k = None):
    left = 0
    right = len(L)-1
    foundmin = False

    while not foundmin:
        mp = (left + right)//2
        if L[mp] > L[mp+1]:
            left = mp
        elif L[mp-1] < L[mp]:
            right = mp+1
        else:
            return L[mp]

它仅适用于某些列表,例如: L = [9,9,4,3,2,1,7,7,10,10]

但它不能正确处理列表,例如: L = [6,5,4,3,3,3,3,3,3,3,3,3,1,7,7,7,7]

我曾尝试修改函数以容纳重复的元素,但无济于事。我也没有看到该函数的输入 k 的效用。想法?

最佳答案

此代码在 O(logn) 中运行并且没有使用 k 参数。

这是某种二进制搜索,就像@coldspeed 评论的那样。

def find_min(l, k=None):
    left = 0
    right = len(l) - 1
    while left <= right:
        middle = (left + right) // 2
        if l[middle] < l[left] or (l[middle] == l[left] and middle > left):
            left = middle
        elif l[middle] < l[right] or (l[middle] == l[right] and middle < right):
            right = middle
        else:
            return l[middle]

关于python - 在先递减然后递增且可能包含重复项的列表中查找最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52809860/

相关文章:

python - 正确值的文件输出错误

python - 如何在 Pandas 数据框的每一行中的选定列中找到两个最低值?

python - 如何求解 numpy 数组上的符号方程?

python - 如何根据使用特定列进行比较的另一个 CSV 中的行删除一个 CSV 中的行

python - 为什么我使用这样的for循环,但仍然收到IndexError?

java - 如何让这段代码停止在非数字的地方?

c++ - 有没有更好的方法来检查一个值是否大于 double 类型?

python - 用 SVD 计算 spinv

python - 绑定(bind)、发布、解除绑定(bind)、重复

从数据框列表的最后一列中删除字符