知识点

双指针

思路

维护两个指针,i在左边,j在右边,i从左到右遍历,当遇到i指向的位置是1的时候,j向左移动找到最近的0,然后交换,如果i和j相遇则表示完成。

时间复杂度

双指针,每个节点只会访问常数次,时间复杂度为O(n)

AC Code(C++)

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param cows int整型vector 
     * @return int整型vector
     */
    vector<int> sortCows(vector<int>& cows) {
        int n = cows.size();
        for (int i = 0, j = n - 1; i <= j; i ++) {
            if (!cows[i]) continue;
            while (j >= i and cows[j] == 1) j --;
            if (i < j and cows[j] == 0) {
                swap(cows[i], cows[j]);
                j --;
            }
        }
        return cows;
    }
};