问题描述 给定一个长度为 n 的序列 a1,a2,…,an,你可以选择删去其中最多n−1 个数,得到一个新序列 b1,b2,…,bm(1≤m≤n),新序列保留原来的相对顺序。你的目标是删除某些数,使得新序列的第 i 个数 bi=i。现在需要求出最少删除多少个数才能得到这样的序列,如果无法得到,输出 −1。 例如,对于序列 [1, 4, 2, 3, 5],删除第 2 个和第 5 个元素后,可以得到序列 [1, 2, 3]。
测试样例
样例1: 输入:n = 5 ,a = [1, 4, 2, 3, 5] 输出:2
样例2: 输入:n = 3 ,a = [3, 3, 2] 输出:-1
样例3: 输入:n = 5 ,a = [1, 2, 3, 4, 5] 输出:0
思路:本题就是用队列的思想,本题想找出一个单调递增的数列,同时当前元素比上一个数大1,所以可以利用这点,初始化last=0,从头遍历a,如果a[i] != last+1,那么就需要删掉这个数,同时ans+=1,否则,就更新last为a[i]。最后,如果ans == n,说明无论怎样都不会有序,返回-1,否则返回ans。
def solution(n: int, a: list) -> int:
a = a[::-1]
ans = 0
last = 0
while a:
s = a.pop()
if s != last+1:
ans += 1
else:
last = s
# write code here
if ans == n:
return -1
return ans # placeholder return
if __name__ == '__main__':
print(solution(5, [1, 4, 2, 3, 5]) == 2)
print(solution(3, [3, 3, 2]) == -1)
print(solution(5, [1, 2, 3, 4, 5]) == 0)