[E模拟] lc2765. 最长交替子数组(模拟+优化)

文章目录

    • 1. 题目来源
    • 2. 题目解析

1. 题目来源

链接:2765. 最长交替子数组

2. 题目解析

简单题简单做,纯模拟就行了。

思路:

  • 两层循环,第一层循环以 i 为子数组起点,第二层循环以 j = i+1 为起点,向后判断满足要求的最大子数组终点在哪里。
  • j 循环内部实现相邻两个数的滚动操作。简单根据满足要求的子数组长度的奇偶性来判断相邻两数的大小关系即可。
  • 最终需要给这个长度 cnt 加1,如果长度 cnt == 0 的话,说明就没有满足要去的数组存在。

优化相关:

  • 看到 官解 中有个一次遍历的操作,类似贪心算法,也是算法优化版本,但感觉不怎么实用,针对这个数据量还是简单处理就行。有兴趣可以去看看这个优化版本。
  • 针对这个长度和奇偶性之间的关系,可以省略这个 cnt 参数,代码可以更加优雅点。固定起点,向后遍历的 j 值,如果是偶数长度的话,nums[j] 要比起点大1,技术长度的话要等于起点值。故使用 % 2操作即可实现。

  • 时间复杂度 O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度 O ( 1 ) O(1) O(1)

class Solution {
public:
    int alternatingSubarray(vector<int>& nums) {
        int res = -1, n = nums.size();
        for (int i = 0; i < n; i ++ ) {
            int cnt = 0;
            int a = nums[i];
            for (int j = i + 1; j < n; j ++ ) {
                int b = nums[j];
                if (cnt % 2 == 0) {
                    if (b - a == 1) cnt ++ ;
                    else break;
                } else {
                    if (b - a == -1) cnt ++ ;
                    else break;
                }
                a = b;
            }
            if (cnt > 0) cnt ++ , res = max(res, cnt);
            
        }

        return res;
    }
};

优化 cnt:

class Solution {
public:
    int alternatingSubarray(vector<int>& nums) {
        int res = -1;
        int n = nums.size();
        for (int firstIndex = 0; firstIndex < n; firstIndex++) {
            for (int i = firstIndex + 1; i < n; i++) {
                int length = i - firstIndex + 1;
                if (nums[i] - nums[firstIndex] == (length - 1) % 2) {
                    res = max(res, length);
                } else {
                    break;
                }
            }
        }
        return res;
    }
};

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