力扣刷题之978.最长湍流子数组

题干要求:

给定一个整数数组 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.定义辅助数组,定义两个数组 updown,分别记录到当前元素为止的湍流子数组长度,其中 up 表示最后一步是上升,down 表示最后一步是下降。

3.遍历数组,

  • 从第二个元素开始遍历,比较当前元素与前一个元素的大小关系:
    • 如果当前元素大于前一个元素,更新 up 数组,将当前元素的 up 值设为前一个元素的 down 值加1,down 值设为1。
    • 如果当前元素小于前一个元素,更新 down 数组,将当前元素的 down 值设为前一个元素的 up 值加1,up 值设为1。
    • 如果当前元素等于前一个元素,则 updown 都重置为1。
  • 更新 maxLengthupdown 中的最大值。

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;//返回最大湍流子数组的长度

	}

}

这道题整体难度偏简单根据以上思路即可实现题干要求。相关的运行结果如下:

相关推荐

  1. 题解( 湍流数组)

    2024-07-16 00:02:01       24 阅读
  2. 每日一2765交替数组

    2024-07-16 00:02:01       67 阅读
  3. 练习】300. 递增序列

    2024-07-16 00:02:01       43 阅读
  4. 2024.1.23每日一——交替数组

    2024-07-16 00:02:01       56 阅读
  5. 公共序列

    2024-07-16 00:02:01       31 阅读
  6. 2765-交替数组

    2024-07-16 00:02:01       65 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 00:02:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 00:02:01       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 00:02:01       58 阅读
  4. Python语言-面向对象

    2024-07-16 00:02:01       69 阅读

热门阅读

  1. 数据结构初阶(C语言)-顺序表

    2024-07-16 00:02:01       22 阅读
  2. C# 做一个临时的对象结构,并用linq查找

    2024-07-16 00:02:01       16 阅读
  3. 动态路由-ospf

    2024-07-16 00:02:01       23 阅读
  4. 如何备份Syslog配置文件?

    2024-07-16 00:02:01       18 阅读
  5. float和double使用注意问题

    2024-07-16 00:02:01       20 阅读
  6. excel及panda的部分内容

    2024-07-16 00:02:01       20 阅读
  7. 消息中间件面试题

    2024-07-16 00:02:01       21 阅读
  8. Kafka配置SSL信道加密

    2024-07-16 00:02:01       21 阅读
  9. TensorFlow 的基本概念和使用场景

    2024-07-16 00:02:01       18 阅读