LeetCode解法汇总2760. 最长奇偶子数组

 目录链接:

力扣编程题-解法汇总_分享+记录-CSDN博客

GitHub同步刷题项目:

https://github.com/September26/java-algorithms

原题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台


描述:

给你一个下标从 0 开始的整数数组 nums 和一个整数 threshold 。

请你从 nums 的子数组中找出以下标 l 开头、下标 r 结尾 (0 <= l <= r < nums.length) 且满足以下条件的 最长子数组 :

  • nums[l] % 2 == 0
  • 对于范围 [l, r - 1] 内的所有下标 i ,nums[i] % 2 != nums[i + 1] % 2
  • 对于范围 [l, r] 内的所有下标 i ,nums[i] <= threshold

以整数形式返回满足题目要求的最长子数组的长度。

注意:子数组 是数组中的一个连续非空元素序列。

示例 1:

输入:nums = [3,2,5,4], threshold = 5
输出:3
解释:在这个示例中,我们选择从 l = 1 开始、到 r = 3 结束的子数组 => [2,5,4] ,满足上述条件。
因此,答案就是这个子数组的长度 3 。可以证明 3 是满足题目要求的最大长度。

示例 2:

输入:nums = [1,2], threshold = 2
输出:1
解释:
在这个示例中,我们选择从 l = 1 开始、到 r = 1 结束的子数组 => [2] 。
该子数组满足上述全部条件。可以证明 1 是满足题目要求的最大长度。

示例 3:

输入:nums = [2,3,4,5], threshold = 4
输出:3
解释:
在这个示例中,我们选择从 l = 0 开始、到 r = 2 结束的子数组 => [2,3,4] 。 
该子数组满足上述全部条件。
因此,答案就是这个子数组的长度 3 。可以证明 3 是满足题目要求的最大长度。

提示:

  • 1 <= nums.length <= 100
  • 1 <= nums[i] <= 100
  • 1 <= threshold <= 100

解题思路:

这题虽然是简单题,但是如果想使用O(n)的是时间复杂度来解决,其实并没有的简单。

这题求符合条件的数组的最大长度,那么很自然的就可以联想到滑动区间,设置left和right来确定一个区间,这个区间是就是符合的。

首先移动left,如果起点不符合要求,则往后移动;

如果起点符合要求,则移动right,看这个区间可以多大范围。

移动right的过程中,如果nums[right] > threshold不符合,则更新left和right的位置。

如果nums[right - 1] % 2 == nums[right] % 2,则也更新left和right,和上面不通的时候,此时当前位置,left还是可以使用当前位置的,但是right需要+1。

代码:

class Solution {
public:
    int longestAlternatingSubarray(vector<int> &nums, int threshold)
    {
        int maxLength = 0;
        int left = 0;
        int right = 0;
        while (left < nums.size() && right < nums.size())
        {
            if (nums[left] % 2 != 0)
            {
                left++;
                continue;
            }
            if (right < left)
            {
                right = left;
            }
            while (right < nums.size())
            {
                if (nums[right] > threshold)
                {
                    left = ++right;
                    break;
                }
                if (left < right && (nums[right - 1] % 2 == nums[right] % 2))
                {
                    left = right;
                    right++;
                    break;
                }
                right++;
                maxLength = max(right - left, maxLength);
            }
        }
        return maxLength;
    }
};

猜你喜欢

转载自blog.csdn.net/AA5279AA/article/details/134442478
今日推荐