二分查找——递归

二分查找又称折半查找,是对一个有序的列表通过按中间元素切分搜索空间进行快速查找的,也可以通过递归方法实现,

题目1

给定一个整数数组ribbons和一个整数k,数组每项ribbons[i]表示第i条绳子的长度。对于每条绳子,你可以将任意切割成一系列长度为正整数的部分,或者选择不进行切割。

你的任务是最终得到 k 条完全一样的绳子,他们的长度均为相同的正整数。如果绳子切割后有剩余,你可以直接舍弃掉多余的部分。对于这 k 根绳子,返回你能得到的绳子最大长度;
如果你无法得到 k 根相同长度的绳子,返回 0。

例如,如果给你一条长度为 4 的绳子,你可以:

  • 保持绳子的长度为 4 不变;
  • 切割成一条长度为 3 和一条长度为 1 的绳子;
  • 切割成两条长度为 2 的绳子;
  • 切割成一条长度为 2 和两条长度为 1 的绳子;
  • 切割成四条长度为 1 的绳子。

解题思路

将整个问题看做是二分查找,以最长绳子的长度作为最大查找长度,以1作为最小查找长度,目标是查找的一个最大的长度将每个绳子按该长度进行裁剪,裁剪得到的等长的绳子的数量大于等于K。

代码:

n,k=map(int ,input().split(" "))
data=list(map(int,input().split(" ")))
max_len=max(data)
res = []
def find_max_line(min_ribbon,max_ribbon):

    # while max_ribbon>min_ribbon:
    if max_ribbon>min_ribbon:
        print(max_ribbon,min_ribbon)
        mid_ribbon=(max_ribbon+min_ribbon)//2
        cur_k=0
        for d in data:
            cur_k+=d//mid_ribbon
        if cur_k>=k:
            find_max_line(mid_ribbon+1,max_ribbon)
            # min_ribbon=mid_ribbon+1
            res.append(mid_ribbon)
        else:
            find_max_line(min_ribbon,mid_ribbon-1)
            # max_ribbon=mid_ribbon-1
print(find_max_line(1,max_len))
print(max(res))

你可能感兴趣的:(面试,python,递归,二分查找)