📅  最后修改于: 2023-12-03 15:37:08.514000             🧑  作者: Mango
在处理数组问题时,有时需要寻找数组中符合一定条件的子数组。本文将介绍如何寻找只有一个值大于 k 的最长子数组。
给定一个整数数组 nums 和一个整数 k,找到只有一个元素大于 k 的最长子数组的长度。
该方法是最容易想到的方法。对于数组 nums 中的每个元素,我们依次尝试将其作为只有一个元素大于 k 的最长子数组的起点,然后遍历下一个元素,直到找到一个元素大于 k。记录此时子数组的长度,并继续探索下一个元素。枚举所有元素作为起点的情况,即可得到只有一个元素大于 k 的最长子数组的长度。
时间复杂度: O(n^2)
代码片段:
def longestSubarray(nums: List[int], k: int) -> int:
n = len(nums)
ans = 0
for i in range(n):
cnt = 0
for j in range(i, n):
if nums[j] > k:
cnt += 1
if cnt > 1:
break
if cnt == 1:
ans = max(ans, j-i+1)
return ans
对于每个右端点 r,左端点 l 的位置可以根据以下规则更新:
时间复杂度: O(n)
代码片段:
def longestSubarray(nums: List[int], k: int) -> int:
n = len(nums)
cnt, l, ans = 0, 0, 0
for r in range(n):
if nums[r] > k:
cnt += 1
while cnt > 1:
if nums[l] > k:
cnt -= 1
l += 1
ans = max(ans, r-l+1)
return ans
本文介绍了如何寻找只有一个元素大于 k 的最长子数组。通过暴力枚举和滑动窗口两种方法,可以在不同场景下高效地解决该问题。