有没有更Pythonic的写法?求优化判断移除最多一个元素获严格递增序列的代码
代码优化思路:判断移除最多一个元素后是否为严格递增序列
你的代码功能是正确的,但存在可以优化的空间,主要集中在时间效率和操作开销上,以下是具体的优化思路和实现:
原代码的问题分析
- 时间复杂度高:外层循环遍历每个元素(O(n)),每次循环里的
pop/insert操作是O(n),调用hh函数又要遍历一次数组(O(n)),整体时间复杂度达到O(n²),对于大规模数组性能会很差。 - 不必要的数组修改:每次
pop再insert的操作完全是冗余的,不需要真的修改原数组就能完成检查。 - 冗余函数调用:
hh函数的逻辑可以整合到主流程中,避免额外的函数调用开销。
优化思路
核心方向:一次遍历+逻辑判断替代数组修改
不需要逐个删除元素再检查,而是在一次遍历中记录递减的次数,同时判断当前递减是否可以通过移除单个元素修复,全程只需要遍历数组一次,时间复杂度降到O(n)。
优化后的代码实现
方法1:一次遍历直接判断(最优)
def solution(sequence): remove_count = 0 n = len(sequence) for i in range(n - 1): if sequence[i] >= sequence[i + 1]: remove_count += 1 if remove_count > 1: return False # 两种修复可能:移除当前元素 或 移除下一个元素 # 如果当前是第一个元素,或者前一个元素小于下一个元素,移除当前元素即可继续检查 if i == 0 or sequence[i - 1] < sequence[i + 1]: continue # 否则必须移除下一个元素,将下一个元素的值替换为当前元素(模拟跳过下一个) else: sequence[i + 1] = sequence[i] return remove_count <= 1
方法2:跳过指定索引检查(更直观)
如果不想修改原数组,可以通过跳过指定索引的方式模拟移除操作,只在遇到递减时才检查两种跳过情况:
def solution(sequence): def is_strictly_increasing(arr, skip_idx): prev = float('-inf') for idx, num in enumerate(arr): if idx == skip_idx: continue if num <= prev: return False prev = num return True error_count = 0 for i in range(len(sequence) - 1): if sequence[i] >= sequence[i + 1]: error_count += 1 if error_count > 1: return False # 检查跳过当前元素 或 跳过下一个元素是否能让数组递增 if not (is_strictly_increasing(sequence, i) or is_strictly_increasing(sequence, i + 1)): return False return True
优化点说明
- 时间效率提升:两种方法的时间复杂度都是O(n),相比原代码的O(n²),处理大数组时性能提升明显。
- 减少冗余操作:避免了
pop/insert这类O(n)的数组修改操作,节省了内存和时间开销。 - 提前终止逻辑:一旦发现需要移除超过一个元素,或者遇到无法通过单个元素移除修复的递减情况,直接返回结果,避免不必要的后续遍历。
测试用例验证:
solution([1,3,2,1])返回Falsesolution([1,3,2])返回True
内容的提问来源于stack exchange,提问作者Babatunde Mustapha
相关产品推荐
相关产品推荐

