2760. 最长奇偶子数组

文章介绍了如何在给定整数数组nums和阈值threshold的情况下,寻找以0为下标的最长子数组,该子数组满足:元素能被2整除,相邻元素异奇偶且小于threshold。给出了两种解题方法:暴力拆解法和简洁遍历法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给你一个下标从 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

方案一

暴力拆解法 

参考:https://www.cnblogs.com/coderhrz/p/17835945.html 

class Solution {
public:
    int longestAlternatingSubarray(vector<int>& nums, int threshold) {
        int  i = 0;
        int len = 0,count=0;
        for (; i < nums.size(); ++i) {
            if (nums[i] <= threshold && nums[i] % 2 == 0)
                break;
        }
        if (i < nums.size()) {
            len = 1;
            count = 1;
        }
        else
            return 0;
        while (i < nums.size()-1) {
            if (nums[i] % 2 != nums[i +1] % 2 && nums[i] <= threshold&& nums[i+1] <= threshold) {
                i++;
                count++;
                len = max(count, len);
            }
            else 
            {
                len = max(count, len);
                i += 1;
                for (; i < nums.size(); ++i) {
                    if (nums[i] <= threshold && nums[i] % 2 == 0)
                        break;
                }
                count = 1;
            }
        }
        return len;
    }
};

这里的解题思路是先遍历数组然后找到第一个能被2整除的数,然后记录下标,从这个数开始往后找符合要求的数。

在寻找之前需要加一个判断特殊值的条件:如果这个数组只有一个数,那就是下标会小于nums.size(),然后直接设置len=1 否则数组没有符合的值返回0。

如果数组不止一个就接着往下判断 然后符合条件就将下标和count (表示目前的长度)加1,然后每次都要比较count和len的长度随时更新最大值。

如果不符合条件也需要先保存目前更新的最大值然后从这个下标i开始重新寻找符合条件的起始点,继续循环直到跳出while 输出最大值。

总的来说这段代码只便利了一遍数组,通过随时更新最大值来寻找。

方案二 

class Solution {
public:
    int longestAlternatingSubarray(vector<int>& nums, int threshold) {
        int res=0;
        for(int i=0;i<nums.size();++i){
            int temp_res=0;
            if(nums[i]%2==0&&nums[i]<=threshold){
                temp_res=1;
                while(i+1<nums.size()&&nums[i]%2!=nums[i+1]%2&&nums[i]<=threshold&&nums[i+1]<=threshold){
                    ++temp_res;
                    ++i;
                }
            }
            res=res>temp_res?res:temp_res;
        }
        return res;
    }
};

这种解法比较简洁,直接便利一遍数组,从0开始当作起始值,然后找到第一各可以整除2并且小于threshold的点设置长度为1,然后遍历从i开始符合条件的数值,更新长度,直到不符合以后更新最大长度,直到数值遍历完成。输出最大值。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShasHashALU

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值