文章目录
- Tag
- 题目来源
- 解题思路
- 方法一:双层循环
- 方法二:单层循环
- 写在最后
Tag
【双层循环】【单层循环】【数组】【2024-01-23】
题目来源
2765. 最长交替子数组
解题思路
两个方法,一个是双层循环,一个是单层循环。
方法一:双层循环
思路
第一层枚举子数组的起点,第二层从起点的下一个元素开始枚举,判断接下来的字符是否满足交替子数组的条件。如是则更新长度,否则调出内层循环。
算法
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;}
};
复杂度分析
时间复杂度: O ( n 2 ) O(n^2) O(n2), n n n 为数组 nums
的长度。
空间复杂度: O ( 1 ) O(1) O(1)。
方法二:单层循环
思路
解题思路参考 教你一次性把代码写对!O(n) 分组循环(Python/Java/C++/Go/JS/Rust)。
算法
class Solution {
public:int alternatingSubarray(vector<int> &nums) {int ans = -1;int i = 0, n = nums.size();while (i < n - 1) {if (nums[i + 1] - nums[i] != 1) {i++; // 直接跳过continue;}int i0 = i; // 记录这一组的开始位置i += 2; // i 和 i+1 已经满足要求,从 i+2 开始判断while (i < n && nums[i] == nums[i0] + (i - i0) % 2) {i++;}// 从 i0 到 i-1 是满足题目要求的(并且无法再延长的)子数组ans = max(ans, i - i0);i--;}return ans;}
};
复杂度分析
时间复杂度: O ( n ) O(n) O(n), n n n 为数组 nums
的长度。
空间复杂度: O ( 1 ) O(1) O(1)。
写在最后
如果您发现文章有任何错误或者对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。
如果大家有更优的时间、空间复杂度的方法,欢迎评论区交流。
最后,感谢您的阅读,如果有所收获的话可以给我点一个 👍 哦。