OPPO校招算法题

有一个无序的数组,数组一共有n个元素且元素大小各不相同,每一次操作都可以把某一个元素提到数组的最前边,问至少经过多少次操作后可以把数组变为升序数组。
 
新建一个二维数组a[2][n],将数组降序排序存入a[1],将其下标存入a[2],令a[2]中第一个不满足a[2][m]<a[2][m-1]的m为l,则本题答案为n-l。
首先确定一点:最少操作的次数k肯定不大于n,因为对于任何数组,先把最大的数提到最前边,然后每次都提剩下的数中最大的数,这样只需经过n次操作即可满足要求。
做出以下假设:
假设存在一个数组,其操作次数最少时对应的第一次提到最前边的数不是a[l]。
则在第一次提数之后,a[l-1]必然在a[l]的前边,为了满足升序的要求,之后必然要把a[l]提到前边去,而把a[l]提到最前边之后,最少还需n-l-1次操作才能满足整个数组升序的要求,所以总的操作次数至少为n-l+1次。
而如果第一次提到最前边的数是a[l]的话,最少的总的操作次数为n-l(每次都提最接近上次提的且小于上次提的数的数),与假设矛盾,所以假设不成立,所以对于任意数组,其操作次数最少时对应的第一次提到最前边的数必然是a[l],所以最小操作次数为n-l。
我师兄说的方法是将每个元素的坐标与其在数组中的实际的大小排名相减,得到的数的绝对值最大的数就是本题答案。
 
原文地址:https://www.cnblogs.com/lau1997/p/13551432.html