牛客网刷题笔记---求最短未排序子序列

来源:互联网 发布:手机指画软件 编辑:程序博客网 时间:2024/06/07 00:31

题目是:

对于一个无序数组A,请设计一个算法,求出需要排序的最短子数组的长度。

给定一个整数数组A及它的大小n,请返回最短子数组的长度。

测试样例:
[1,5,3,4,2,6,7],7
返回:4
在考虑这道题时,思路是,先将该未排序的数组进行排序,然后将排好序的和未排好序的数组串进行比较,前后各放一个指针,前边的指针所指的值相同,则向后移动直到不相同为止,后边的向前移动,直至不相同为止,两个指针的距离加一即为最短子数组长度,当两指针指向同一位置时,返回零。

代码如下:

class ShortSubsequence {
public:
    int findShortest(vector<int> A, int n) {
        // write code here
        vector<int> B = A;
        for (int i = 0; i < n; ++i)
            for (int j = i; j < n; ++j) {
            if (B[i] > B[j]) {
                int temp = B[i];
                B[i] = B[j];
                B[j] = temp;
            }
        }
        int head = 0, tail = n - 1;
        while (head < tail) {
            if (A[head] == B[head])
                head ++;
            if (A[tail] == B[tail])
                tail --;
            if (A[head] != B[head] && A[tail] != B[tail])
                break;
        }
        if (tail == head)
            return 0;
        else
            return tail - head + 1;
    }
};

不过我怎么感觉我的这个方法有钻空子嫌疑,只是为了通过测试用例而已。试想一下,如果有一个效率高的算法,能够得到最小未排序子序列,然后只对子序列进行排序,那么这样,对整个数组的排序操作,性能是不是更好呢?

不管了,现阶段是先能写出正确的代码,过一段时间,在数据结构和算法熟悉的基础上,在考虑代码的优化吧。

还有一个想说的是,每次排序,我都是用交换来进行排序的,这样的排序简单,能够快速地写出代码,缺点就是时间复杂度太高,在以后地题目上,要多多练习其他高效地排序算法。

0 0
原创粉丝点击