Python求助:判断移除至多一个元素能否得到严格递增序列
问题:判断是否可通过移除至多一个元素得到严格递增序列
给定一个整数数组形式的序列,判断是否可以通过移除至多一个元素得到严格递增序列。
说明:若序列a₀, a₁, ..., aₙ满足a₀ < a₁ < ... < aₙ,则视为严格递增序列。仅含一个元素的序列也视为严格递增序列。
示例:
- 当
sequence = [1, 3, 2, 1]时,输出应为solution(sequence) = false。无法通过移除数组中的一个元素得到严格递增序列。 - 当
sequence = [1, 3, 2]时,输出应为solution(sequence) = true。可以移除3得到严格递增序列[1, 2],或移除2得到[1, 3]。
我的代码
def solution(sequence): if len(sequence) == 1: return True else: count = 0 for i in range(0,len(sequence) - 1): if sequence[i] >= sequence[i + 1]: count = count + 1 for i in range(0,len(sequence) - 2): if sequence[i] >= sequence[i + 2]: count = count + 1 return count <= 1
代码覆盖情况分析
- 情况1:序列仅含一个元素。已通过第一个if语句处理。
- 情况2:存在多个下降步(即当前元素大于等于下一个元素),此时无法通过移除一个元素调整序列,返回
false(count > 1)。已处理该情况。 - 情况3:仅存在一个下降步,但仍无法通过移除一个元素解决。比如序列
[1,4,3,2],即使移除3仍存在下降步。我通过第二个循环检查当前元素是否大于等于下下个元素,若成立则增加count来处理该情况。 - 未覆盖情况:当某个元素的下一个和下下个元素都小于它,但移除该元素即可得到严格递增序列。例如
[1,4,2,3],移除4后序列合法。该情况可能出现在问题元素为序列第一个元素或其他位置,不知道如何正确处理,也觉得当前方案过于零散,求助优化思路。
注:无需实际生成严格递增序列,仅需判断是否可行。
优化思路
你的当前计数逻辑存在漏洞,容易误判。可以换一种更精准的思路:遍历序列时,一旦遇到第一个sequence[i] >= sequence[i+1]的冲突点,直接尝试两种修复方式——移除sequence[i]或移除sequence[i+1],然后检查修复后的子序列是否严格递增。只要其中一种修复有效,就返回True;若两种都无效,直接返回False;全程没遇到冲突则返回True。
具体实现步骤:
- 先写一个辅助函数,用来判断任意数组是否严格递增。
- 处理长度≤2的特殊情况(这类序列必然满足条件)。
- 遍历序列找冲突点,遇到冲突时验证两种修复后的子序列,根据结果返回对应布尔值。
优化后的代码示例:
def is_strictly_increasing(arr): for i in range(len(arr)-1): if arr[i] >= arr[i+1]: return False return True def solution(sequence): n = len(sequence) if n <= 2: return True for i in range(n-1): if sequence[i] >= sequence[i+1]: # 尝试移除当前元素 if is_strictly_increasing(sequence[:i] + sequence[i+1:]): return True # 尝试移除下一个元素 if is_strictly_increasing(sequence[:i+1] + sequence[i+2:]): return True # 两种修复都失败 return False # 没有冲突点,本身就是严格递增 return True
这种方法逻辑直接,能覆盖所有场景,包括你提到的[1,4,2,3]这类情况,避免了原方案中计数逻辑的局限性。
内容的提问来源于stack exchange,提问作者Dan Öz
相关产品推荐
相关产品推荐

