队列

67 阅读1分钟

问题描述 给定一个长度为 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)