题干要求:
给定一个整数数组 arr
,返回 arr
的 最大湍流子数组的长度 。
如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是 湍流子数组 。
更正式地来说,当 arr
的子数组 A[i], A[i+1], ..., A[j]
满足仅满足下列条件时,我们称其为湍流子数组:
- 若
i <= k < j
:- 当
k
为奇数时,A[k] > A[k+1]
,且 - 当
k
为偶数时,A[k] < A[k+1]
;
- 当
- 或 若
i <= k < j
:- 当
k
为偶数时,A[k] > A[k+1]
,且 - 当
k
为奇数时,A[k] < A[k+1]
。
- 当
示例 1:
输入:arr = [9,4,2,10,7,8,8,1,9] 输出:5 解释:arr[1] > arr[2] < arr[3] > arr[4] < arr[5]
示例 2:
输入:arr = [4,8,12,16] 输出:2
示例 3:
输入:arr = [100] 输出:1
题干分析:
首先我们对题干进行简单的分析:首先简单解释一下湍流子数组的概念:如果比较符号在子数组中的每个相邻元素对之间翻转。这里题干也提供了一些示例便于我们理解:
- 若
i <= k < j
:- 当
k
为奇数时,A[k] > A[k+1]
,且 - 当
k
为偶数时,A[k] < A[k+1]
;
- 当
- 或 若
i <= k < j
:- 当
k
为偶数时,A[k] > A[k+1]
,且 - 当
k
为奇数时,A[k] < A[k+1]
。
- 当
这样我们就可以更好地理解湍流子数组的概念:即在数组中前一位和后一位的大小关系大于关系和小于关系交替出现。
那么我们该如何求解题干呢?详细的解题思路如下:已知题干是要求解一个数组中最长的湍流子数组的长度。因此我们分别需要处理以下情况:
1.处理边界问题,如果数组的大小为1,则返回1,因为一个元素本身就是一个湍流子数组。
2.定义辅助数组,定义两个数组 up
和 down
,分别记录到当前元素为止的湍流子数组长度,其中 up
表示最后一步是上升,down
表示最后一步是下降。
3.遍历数组,
- 从第二个元素开始遍历,比较当前元素与前一个元素的大小关系:
- 如果当前元素大于前一个元素,更新
up
数组,将当前元素的up
值设为前一个元素的down
值加1,down
值设为1。 - 如果当前元素小于前一个元素,更新
down
数组,将当前元素的down
值设为前一个元素的up
值加1,up
值设为1。 - 如果当前元素等于前一个元素,则
up
和down
都重置为1。
- 如果当前元素大于前一个元素,更新
- 更新
maxLength
为up
和down
中的最大值。
4.返回结果,返回 maxLength
,即最大湍流子数组的长度。
根据以上题干分析编写代码:
//定义一个函数用于计算最大湍流子数组的长度
int maxTurbulenceSize(int* arr, int arrSize) {
//若数组的长度为1,则直接返回1
if (arrSize == 1)
{
return 1;
}
//定义两个数组用于存储上升和下降的湍流子数组长度
int* up = (int*)malloc(arrSize * sizeof(int));
int* down = (int*)malloc(arrSize * sizeof(int));
if (up == NULL || down == NULL)
{
//若内存分配失败,则返回0
return 0;
}
//初始化第一个元素的湍流长度
up[0] = down[0] = 1;
int maxLength = 1;//最大湍流子数组的长度
//从第二个元素开始遍历数组
for (int i = 0; i < arrSize; i++)
{
if (arr[i] > arr[i - 1]) {
// 当前元素大于前一个元素,更新上升湍流长度
up[i] = down[i - 1] + 1;
down[i] = 1; // 下降湍流长度重置为1
}
else if (arr[i] < arr[i - 1]) {
//当当前的元素小于前一个元素,更新下降湍流长度
down[i] = up[i - 1] + 1;
up[i] = 1;
}
else {
//当当前元素等于前一个元素时。湍流长度都重置为1
up[i] = down[i] = 1;
}
//更新最大湍流子数组的长度
if (maxLength < up[i])
{
maxLength = up[i];
}
if (maxLength < down[i])
{
maxLength = down[i];
}
//释放动态分配的内存
free(up);
free(down);
return maxLength;//返回最大湍流子数组的长度
}
}
这道题整体难度偏简单根据以上思路即可实现题干要求。相关的运行结果如下: