• [LeetCode] 922. Sort Array By Parity II


    Description

    Given an array A of non-negative integers, half of the integers in A are odd, and half of the integers are even.

    Sort the array so that whenever A[i] is odd, i is odd; and whenever A[i] is even, i is even.

    You may return any answer array that satisfies this condition.

    Example 1:

    Input: [4,2,5,7]
    Output: [4,5,2,7]
    Explanation: [4,7,2,5], [2,5,4,7], [2,7,4,5] would also have been accepted.
    

    Note:

    1. 2 <= A.length <= 20000
    2. A.length % 2 == 0
    3. 0 <= A[i] <= 1000

    Analyse

    A是一个非负整数数组,一半奇数一半偶数

    A进行排序,使A的奇数位置为奇数,偶数位置为偶数

    使用两个int变量存储奇数和偶数的位置

    even(偶) 存储第一个存了奇数的偶数位置

    odd(奇) 存储第一个存了偶数的奇数位置

    每一趟循环都找一遍oddeven,然后交换这两个位置的值,进入下一次循环

    下面是第一个版本的代码,写完后AC,甚至能faster than 100.00%

    vector<int> sortArrayByParityII(vector<int>& A) {
        int even = 0; // first even position with a odd
        int odd = 1;  // first odd position with a even
    
        for(int i = 0; i < A.size(); i++)
        {
            while ((A[even] % 2 == 0) && (even < A.size() - 1))
            {
                even += 2;
            }
    
            while ((A[odd] % 2 != 0) && (odd < A.size()))
            {
                odd += 2;
            }
    
            if ((i % 2) != (A[i] % 2))
            {
                int tmp = A[even];
                A[even] = A[odd];
                A[odd] = tmp;
            }
    
        }
        return A;
    }
    

    但是这个版本代码的循环退出条件有点怪,比如这些地方,for循环出现就很诡异,这个if判断后交换两元素的值也是,算出evenodd后并不一定会立即交换,而是会等到遍历到奇数位不为奇数或偶数位不为偶数时才交换,最后虽然能交换成功,但总归是不太好的解法

    我也不知道这个版本我怎么写出来的,似乎是在for循环输出vector的代码基础上改的

    for(int i = 0; i < A.size(); i++)
    
    if ((i % 2) != (A[i] % 2))
    {
        int tmp = A[even];
        A[even] = A[odd];
        A[odd] = tmp;
    }
    
    

    继续写第二个版本,思考循环终止条件,循环终止的时候每个奇数位都是奇数,偶数位都是偶数了

    再计算evenodd的时候就会大于A.size(),使用这个当作循环结束的条件(copy了LeetCode上的代码)

    vector<int> sortArrayByParityII(vector<int>& A) {
        int even = 0; // first even position with a odd
        int odd = 1;  // first odd position with a even
    
        while ((even < A.size() - 1) && odd < A.size())
        {
            while ((A[even] % 2 == 0) && (even < A.size() - 1))
            {
                even += 2;
            }
    
            if (even >= A.size() - 1)
            {
                break;
            }
    
            while ((A[odd] % 2 != 0) && (odd < A.size()))
            {
                odd += 2;
            }
    
            if (odd >= A.size())
            {
                break;
            }
    
            int tmp = A[even];
            A[even] = A[odd];
            A[odd] = tmp;
        }
        return A;
    }
    
  • 相关阅读:
    表:t_category
    使用 Javascript 代码,增加 HTML 新元素(节点)
    Kind Editor 笔记
    [ 摘 ] 对 js 运算符 “||” 和 “&&” 的总结
    Oracle 的分页查询,myBatis 配置文件
    ExtJS 的工具条及菜单
    发一个 ExtJS 4.2.0 的页面源码(规则比对公式 的设置页面)
    MyBatis 中的 set 元素用法(MyBatis 3.1.1)
    MySQL 存储过程,一个 4 层的游标,用于规则比对,不知道性能如何。
    jmeter从文件中读取参数
  • 原文地址:https://www.cnblogs.com/arcsinw/p/10311901.html
Copyright © 2020-2023  润新知