[滑动窗口]找出最长等值子数组

题目

2831. 找出最长等值子数组 - 力扣(LeetCode)

        给你一个下标从 0 开始的整数数组 nums 和一个整数 k ,如果子数组中所有元素都相等,则认为子数组是一个 等值子数组 。注意,空数组是 等值子数组 。从 nums 中删除最多 k 个元素后,返回可能的最长等值子数组的长度。子数组 是数组中一个连续且可能为空的元素序列。

        示例 1:

        输入nums = [1,3,2,3,1,3], k = 3
        输出3
        解释最优的方案是删除下标 2 和下标 4 的元素。
        删除后,nums 等于 [1, 3, 3, 3] 。
 &n
### Java 滑动窗口算法实现:寻找最长连续子数组长度 以下是一个基于滑动窗口算法的解决方案,用于在Java中找到满足条件的最长连续子数组长度。子数组中的元素需大于某个数,允许中间有1个例外值但不能位于两端。 #### 代码实现 ```java public class SlidingWindow { public static int longestSubarray(int[] nums, int threshold) { int n = nums.length; int left = 0; int exceptionCount = 0; int maxLength = 0; for (int right = 0; right < n; right++) { if (nums[right] <= threshold) { exceptionCount++; } // 确保例外值不在两端 while (exceptionCount > 1 || (left <= right && (exceptionCount == 1 && (nums[left] <= threshold || nums[right] <= threshold)))) { if (nums[left] <= threshold) { exceptionCount--; } left++; } // 更新最大长度 if (exceptionCount <= 1 && left < right) { maxLength = Math.max(maxLength, right - left + 1); } } return maxLength; } public static void main(String[] args) { int[] nums = {1, 3, 5, 2, 7, 4, 9}; int threshold = 4; System.out.println("最长连续子数组长度: " + longestSubarray(nums, threshold)); } } ``` #### 代码解析 - **变量定义**: - `left` 和 `right` 分别表示滑动窗口的左右边界。 - `exceptionCount` 用于记录窗口内小于或等于阈值的元素数量。 - `maxLength` 存储当前满足条件的最长子数组长度[^1]。 - **逻辑流程**: - 遍历数组时,右边界 `right` 不断向右扩展。 - 当遇到小于或等于阈值的元素时,增加 `exceptionCount`。 - 如果 `exceptionCount` 超过1,或者例外值位于窗口两端,则通过移动左边界 `left` 来缩小窗口,直到满足条件。 - 在每次满足条件时,更新 `maxLength` 的值。 - **边界条件**: - 确保例外值不位于窗口的两端,这是通过检查 `nums[left]` 和 `nums[right]` 是否小于或等于阈值来实现的[^1]。 #### 复杂度分析 - **时间复杂度**:O(n),其中 n 是数组的长度。每个元素最多被访问两次(一次作为右边界,一次作为左边界)。 - **空间复杂度**:O(1),仅使用了常数额外空间。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值