leetcode:Sort Array By Parity II

综述:数组问题个人总结
(1)遍历问题,单指针还是双指针,单向遍历还是双向遍历
(2)查找问题–hash方法(空间要求),二分查找(有序)
hash算法尤其比较典型的是,字母和数字出现次数问题;数组的值刚好分布在不大于数组长度的自然数里的情况可以天然使用hash方法。
(3)考虑边界的问题,一维和二维数组中都存在边界问题,开头和结尾处可能与其他元素的考虑方式不同
(4)滑动窗口问题,整体无法解决,但是子数组如果具有某些特征,子数组问题就很容易解决了,因为子数组的连续性原因,使用一个双指针滑动窗口比较容易解决问题。(细化成小规模,易解决的问题)。需要注意的一点是,滑动窗口之间必有重叠,因此可以会有重复性计数的问题。
(5)使用动态规划,贪心策略,回溯法来解决

Sort Array By Parity II
问题翻译:偶数个正整数,一半是奇数,一半是偶数,将数组的奇数位置放置奇数,偶数位置放置偶数。
(1)分析:很容易想到开辟一个新的空间,然后遍历一遍数组,偶数的放到新数组偶数下标的位置,奇数的放到奇数位置即可,这么做是O(N)的空间复杂度。开辟新数组的原因是为位置不合法的数找到合法的位置,那么其实我们可以找到一对不合法的组合,交换它们就好了嘛,这也是快排算法实现的思路。
(2)数组的遍历问题,两个指针,单向遍历
(3)证明略
(4)步骤如分析时间复杂度O(n)空间复杂度O(1)

public int[] sortArrayByParityII(int[] A) {
        int start = 0;
        int end = 1;
        while(start<A.length&&end<A.length){
            while(start<A.length&&A[start]%2==0)start+=2;
            while(end<A.length&&A[end]%2==1)end+=2;
            if(start<A.length&&end<A.length){
                int temp =A[start];
                A[start]=A[end];
                A[end] = temp;
                start+=2;
                end+=2;
            }
        }
        return A;
    }

猜你喜欢

转载自blog.csdn.net/weixin_32931837/article/details/88134109
今日推荐