首页 > 试题广场 >

排序次数

[编程题]排序次数
  • 热度指数:2331 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
\hspace{15pt}给定一个长度为 n 的整数数组 \{a_1,a_2,\dots,a_n\}。小摩希望将数组调整为单调不减的顺序,即满足 a_1 \leqq a_2 \leqq\dots \leqq a_n
\hspace{15pt}他只能重复进行以下操作:
{\hspace{20pt}}_\texttt{1.}\,任选一个下标 i\,\left(1\leqq i\leqq n\right)
{\hspace{20pt}}_\texttt{2.}\,将元素 a_i 从当前位置删除,并插入到数组的末尾(其余元素的相对顺序保持不变)。
\hspace{15pt}请你求出使数组变为严格递增所需的最少操作次数。

输入描述:
\hspace{15pt}第一行输入一个整数 n\left(1\leqq n\leqq 5\times 10^3\right) 表示数组的长度。 
\hspace{15pt}第二行输入 n 个整数 a_1,a_2,\dots,a_n\left(-10^3\leqq a_i\leqq 10^3\right) 表示数组元素。


输出描述:
\hspace{15pt}在一行上输出一个整数,代表最少操作次数。
示例1

输入

4
19 7 8 25

输出

2

说明

\hspace{15pt}对于第一组样例: 
\hspace{23pt}\bullet\,第一次操作,将 19 移动到末尾,数组变为 \{7,8,25,19\}
\hspace{23pt}\bullet\,第二次操作,将 25 移动到末尾,数组变为 \{7,8,19,25\},此时数组严格递增。
\hspace{15pt}因此答案为 2
O(n)时间复杂度,找到最小的元素,遍历后面的元素即可!
本来就是解决排序的问题,你来个先排序再处理有点画蛇添足了。
不需要对原数组排序,只需要找到原数组最小的元素后面有多少个顺序元素的数量即可。
因为最小的元素后面的顺序元素不需要额外操作来排序,所以其余的元素都是要额外操作来排序的。
def solve(num):
    x = num.index(min(num))
    stack = [num[x]]
    while x<len(num):
        if num[x]>=stack[-1]:
            stack.append(num[x])
        x += 1
    return len(num)-len(stack)+1
if __name__=='__main__':
    n = int(raw_input().strip())
    num = list(map(int,raw_input().split()))
    print(solve(num))


编辑于 2019-09-12 16:37:05 回复(0)