📌  相关文章
📜  只有一个值大于 k 的最长子数组(1)

📅  最后修改于: 2023-12-03 15:37:08.514000             🧑  作者: Mango

只有一个值大于 k 的最长子数组

在处理数组问题时,有时需要寻找数组中符合一定条件的子数组。本文将介绍如何寻找只有一个值大于 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 的位置可以根据以下规则更新:

  • 如果 r 指向的元素小于等于 k,则将 r 向右移动;
  • 否则,如果目前有 0 个元素大于 k,则两个指针一起向右移动;
  • 否则,如果目前有 1 个元素大于 k,则将 l 向右移动,直到变成 0 个;
  • 重复直到 r 到达数组的末尾。

时间复杂度: 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 的最长子数组。通过暴力枚举和滑动窗口两种方法,可以在不同场景下高效地解决该问题。