Python程序:查找删除单个元素后包含最大值和最小值的子列表数量
假设我们有一个名为 nums 的数字列表,我们最多可以删除列表中的一个元素。我们必须找到包含结果列表的最大值和最小值的子列表的最大数量。
因此,如果输入类似于 nums = [3, 2, 6, 2, 4, 10],则输出将为 8,因为如果我们删除 10,我们将得到 [3, 2, 6, 2, 4],并且有八个子列表包含最大值和最小值:
[2, 6]
[6, 2]
[2, 6, 2]
[3, 2, 6]
[6, 2, 4]
[2, 6, 2, 4]
[3, 2, 6, 2]
[3, 2, 6, 2, 4].
为了解决这个问题,我们将遵循以下步骤:
定义一个函数 check()。它将接收 lst 作为参数
mn := lst 的最小值,mx := lst 的最大值
min_pos := null,max_pos := null
ret := 0
对于 lst 中的每个索引 i 和值 num,执行以下操作:
如果 num 等于 mn,则
min_pos := i
如果 num 等于 mx,则
max_pos := i
如果 min_pos 为 null 或 max_pos 为 null,则
进入下一个迭代
ret := ret + min_pos 和 (max_pos + 1) 中的较小值
返回 ret
从主方法执行以下操作:
如果 nums 的大小 <= 1,则
返回 nums 的大小
ret := check(nums)
对于 [nums 的最小值,nums 的最大值] 中的每个 rem_cand,执行以下操作:
如果 rem_cand 的出现次数为 1,则
idx := rem_cand 在 nums 中的索引
ret := ret 和 check(nums[从索引 0 到 idx - 1] 连接 nums[从索引 idx + 1 到结尾]) 中的较大值
返回 ret
示例
让我们看看以下实现以更好地理解:
class Solution: def solve(self, nums): if len(nums) <= 1: return len(nums) def check(lst): mn, mx = min(lst), max(lst) min_pos, max_pos = None, None ret = 0 for i, num in enumerate(lst): if num == mn: min_pos = i if num == mx: max_pos = i if min_pos is None or max_pos is None: continue ret += min(min_pos, max_pos) + 1 return ret ret = check(nums) for rem_cand in [min(nums), max(nums)]: if nums.count(rem_cand) == 1: idx = nums.index(rem_cand) ret = max(ret, check(nums[:idx] + nums[idx + 1 :])) return ret ob = Solution() nums = [3, 2, 6, 2, 4, 10] print(ob.solve(nums))
输入
[3, 2, 6, 2, 4, 10]
输出
8
数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP