题解 | #游游的最长稳定子数组#(Python3)
游游的最长稳定子数组
https://www.nowcoder.com/practice/ea7098b7960348f6915e252f0c4debcc
# 读取数组的大小 n = int(input()) # 初始化数组,并在其前面添加一个0作为哨兵元素,方便处理边界情况 a = [0] a.extend(list(map(int, input().split()))) # 定义一个函数,判断相邻两数差的绝对值是否大于1 def cal(idx: int) -> bool: # 如果当前索引idx的元素与它前一个元素之差的绝对值大于1,则返回True return abs(a[idx] - a[idx - 1]) > 1 # 定义一个函数,用于检查长度为m的子数组是否稳定 def check(m: int) -> bool: # 如果m大于数组的大小,返回False if m > n: return False # 如果m等于1,任何长度为1的子数组都是稳定的,返回True if m == 1: return True # 初始化计数器,用于记录不稳定的相邻元素对的数量 cnt = 0 # 检查前m-1个元素中有多少对相邻元素是不稳定的 for i in range(2, m): if cal(i): cnt += 1 # 检查从第m个元素到数组末尾的元素 for i in range(m, n + 1): # 如果当前元素与前一个元素不稳定,计数器加1 if cal(i): cnt += 1 # 如果计数器为0,说明当前长度为m的子数组是稳定的 if cnt == 0: return True # 如果当前长度为m的子数组最左边的元素与其下一个元素不稳定,计数器减1 if cal(i - m + 2): cnt -= 1 # 如果检查完所有可能的长度为m的子数组后,没有找到稳定的子数组,返回False return False # 初始化二分查找的左右边界 left = 1 right = n # 进行二分查找 while left < right: # 计算中间值 mid = (left + right) // 2 # 如果存在长度为mid的稳定子数组,则尝试查找更长的稳定子数组 if check(mid): left = mid + 1 # 如果不存在长度为mid的稳定子数组,则在更短的长度中查找 else: right = mid # 输出最长稳定子数组的长度,由于left最终指向的是第一个不稳定的长度,所以输出left-1 print(left - 1)
为什么这里 m==1 可以判断数组稳定?
在代码中,m == 1
判断数组稳定的原因是基于题目中对“稳定”的定义。题目中定义一个数组为“稳定”的,当且仅当数组相邻的两个元素之差的绝对值不超过1。当m == 1
时,意味着我们正在检查的子数组长度为1,只有一个元素。
由于只有一个元素,就不存在相邻元素,因此也就不会违反稳定的定义(即不存在相邻元素之差的绝对值超过1的情况)。换句话说,任何长度为1的子数组都是稳定的,因为没有其他元素与之比较。
所以,当m == 1
时,可以直接返回True
,表示长度为1的子数组是稳定的。这是代码中check
函数的一部分逻辑。
为什么要记录不稳定相邻元素的数量,不是直接计算稳定相邻元素的数量?
在代码中记录不稳定相邻元素的数量而不是稳定相邻元素的数量,是因为我们需要一个明确的停止条件来快速判断一个子数组是否稳定。以下是几个原因说明为什么记录不稳定相邻元素的数量更为有效:
- 快速失败:当我们寻找一个稳定子数组时,一旦发现任何一对不稳定相邻元素,我们就可以立即停止检查当前长度的子数组,因为它不可能是稳定的。如果我们记录稳定相邻元素的数量,我们还需要继续检查整个子数组,以确定是否所有相邻元素都是稳定的。
- 边界条件:在二分查找中,我们通常需要判断一个子数组是否满足某些条件。记录不稳定相邻元素的数量可以让我们更容易地处理边界条件。例如,如果子数组中不稳定相邻元素的数量超过某个阈值,我们可以立即知道这个子数组不满足条件。
- 减少计算量:在检查一个子数组是否稳定时,记录不稳定相邻元素的数量可以减少总的计算量。一旦找到不稳定相邻元素,我们就不需要进一步检查其他相邻元素,因为已经知道子数组不满足稳定条件。
- 优化算法:在二分查找算法中,我们的目标是尽快缩小搜索范围。通过记录不稳定相邻元素的数量,我们可以更快地确定是否需要增加或减少子数组的长度,从而优化整个算法的效率。
总的来说,记录不稳定相邻元素的数量是一种更有效的方法,因为它提供了一种快速判断子数组是否稳定的方法,并且有助于优化算法的性能。如果记录稳定相邻元素的数量,我们可能需要更多的逻辑来处理边界情况和确保所有相邻元素都被检查,这可能会使算法更复杂且效率更低。
#15天刷题#