Python程序:查找最大宽度斜坡
假设我们有一个数组nums,斜坡是一个元组(i, j),其中i < j且nums[i] <= nums[j]。此类斜坡的宽度为(j-i)。我们必须找到nums中斜坡的最大宽度。如果找不到,则返回0。
因此,如果输入类似于nums = [6,0,8,2,1,5],则输出将为4,因为最大宽度斜坡在(i, j) = (1, 5)处实现,并且nums[1] = 0且nums[5] = 5。
为了解决这个问题,我们将遵循以下步骤:
B := 一个新的映射
对于范围从0到nums大小的i,执行:
x := nums[i]
如果x在B中,则
将i插入B[x]的末尾
否则,
B[x] := [i]
mini := 一个最初存储一个无穷大的列表
maxi := 一个最初存储一个负无穷大的列表
对于B的所有键的排序列表中的每个x,执行:
将mini的最后一个元素的最小值和B[x]的最小值插入mini的末尾
对于B的所有键的反向排序列表中的每个x,执行:
将mini的最后一个元素的最小值和B[x]的最小值插入mini的末尾
maxi := 反转maxi,然后取从开始到倒数第二个元素的子数组
mini := mini[从索引1到末尾]的子数组
p := 0
res := 负无穷大
当p < mini的大小时,执行:
res := res和(maxi[p] - mini[p])的最大值
p := p + 1
返回res
示例
让我们看看下面的实现以更好地理解:
def solve(nums): B = {} for i in range(len(nums)): x = nums[i] if x in B: B[x].append(i) else: B[x] = [i] mini = [float('inf')] maxi = [float('-inf')] for x in sorted(B.keys()): mini.append(min(mini[-1], min(B[x]))) for x in sorted(B.keys(), reverse = True): maxi.append(max(maxi[-1], max(B[x]))) maxi = maxi[::-1][:-1] mini = mini[1:] p = 0 res = float('-inf') while p < len(mini): res = max(res, maxi[p] - mini[p]) p += 1 return res nums = [6,0,8,2,1,5] print(solve(nums))
输入
[6,0,8,2,1,5]
输出
4
广告