在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(min_pos和(max_pos + 1))
- 如果num与mn相同,则 –
-
返回ret
-
从主方法中执行以下操作 –
-
如果nums的大小<= 1,则 –
- 返回nums的大小
- ret:=检查(nums)
-
对于[最小(nums) ,最大(nums)]中的每个rem_cand,执行以下操作(
- 如果rem_cand的出现次数为1,则 –
- idx:= nums中rem_cand的索引
-
ret:=max(ret和check(nums [从索引0到idx-1]连接nums [从索引idx + 1到end])
- 如果rem_cand的出现次数为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