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

	}

}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值