• leetcode做题笔记2760. 最长奇偶子数组


    给你一个下标从 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 是满足题目要求的最大长度。

    思路一:模拟题意

    c++解法

    1. class Solution {
    2. public:
    3. int longestAlternatingSubarray(vector<int>& nums, int threshold) {
    4. int curLen = 0;
    5. int maxLen = 0;
    6. for (int num : nums) {
    7. if (num > threshold) curLen = 0;
    8. else if ((num & 1) != (curLen & 1)) curLen = curLen & 1;
    9. else maxLen = max(maxLen, ++curLen);
    10. }
    11. return maxLen;
    12. }
    13. };

    分析:

    根据题意,直接取数组每个元素,求得符合题意的连续最长子数组长度即可解决,nums[i] % 2 != nums[i + 1] % 2 转换为两个数按位与是否相等

    总结:

    本题考察位运算知识,并利用贪心求得最大长度

  • 相关阅读:
    粒子滤波 particle filter —从贝叶斯滤波到粒子滤波——Part-I(贝叶斯滤波)
    【C】关于动态内存的试题及解析
    新能源分布式资产上链 数字新云南启航
    什么是鱼叉式网络钓鱼?
    西安交通大学软件学院学习指南:XJTUSE-GUIDE
    Linux进程(三)--进程切换&命令行参数
    html 笔记:CSS
    Node.js 安装配置
    【UE5】显示或隐藏物体轮廓线
    4种小众的能力,帮你更好地适应未来
  • 原文地址:https://blog.csdn.net/si_mple_/article/details/134449755