力扣打卡 2760-最长奇偶子数组

Problem: 2760. 最长奇偶子数组

思路

这道题要求找到最长的奇偶子数组的长度,其中奇偶性由给定的阈值进行判断。我们可以使用滑动窗口的方法来解决这个问题。我们用两个指针 left 和 right 来表示滑动窗口的左右边界,初始时都指向数组的第一个元素。然后,我们不断移动右指针 right,直到不满足以下所有过滤条件:
找到了字串起点

  1. 当前元素大于阈值 threshold;
  2. 当前元素是奇数。

当遇到满足上述条件之一时,我们将右指针 right 向右移动一位,并继续判断下一个元素。

如果当前元素满足以下条件,则更新最长子数组的长度:

  1. 当前元素小于等于阈值 threshold;
  2. 当前元素的奇偶性与前一个元素的奇偶性不同。
  3. 在遍历过程中,我们不断更新最长子数组的长度,并返回最终的结果。

解题方法

  1. 初始化变量 res 为 0,表示最长子数组的长度。
  2. 初始化变量 rightleft 为 0,表示滑动窗口的左右边界。
  3. 进入循环,判断右指针 right 是否小于数组长度:
    1. 如果当前元素大于阈值 threshold 或者是奇数,说明该元素不是字串的起点,则右指针 right 向右移动一位,并继续判断下一个元素。
    2. 否则,就找到了字串起点,将其赋值给left,我们将右指针 right 向右移动一位,并开始不断判断下一个元素是否满足字串的约束条件。
      1. 当右指针 right 小于数组长度,并且当前元素小于等于阈值 threshold,且当前元素的奇偶性与前一个元素的奇偶性不同,我们将右指针 right 向右移动一位。
        在每次移动右指针 right 的过程中,我们更新最长子数组的长度 res
  4. 返回最终的结果 res

复杂度

  • 时间复杂度:
    O ( n ) O(n) O(n)
    其中 n 是数组的长度。我们最多遍历一次数组中的每个元素

  • 空间复杂度:
    O ( 1 ) O(1) O(1)
    只使用了常数级别的额外空间

Code

class Solution {
    public static int longestAlternatingSubarray(int[] nums, int threshold) {
      int n = nums.length;
      int res = 0;
      int left = 0,right = 0;
      while(right < n){
          //right充当探头,过滤掉不符合字串起始条件的元素
          if(nums[right] > threshold || nums[right] % 2 != 0){
              right++;
              continue;
          }
        //right充当探头找到了字串的起点,将它赋值给left
          left = right;
        //自己向前一位并开始根据字串的约束条件来进行后续的遍历
          right++;
          while(right < n && nums[right] <= threshold && nums[right] % 2 != nums[right - 1] % 2){
              right++;
          }
          res = Math.max(res,right - left);
      }
      return res;
    }
}

你可能感兴趣的:(leetcode,算法)