zoukankan      html  css  js  c++  java
  • 【力扣】922. 按奇偶排序数组 II

    给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数。

    对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数;当 A[i] 为偶数时, i 也是偶数。

    你可以返回任何满足上述条件的数组作为答案。

    示例:

    输入:[4,2,5,7]
    输出:[4,5,2,7]
    解释:[4,7,2,5],[2,5,4,7],[2,7,4,5] 也会被接受。
     

    提示:

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

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/sort-array-by-parity-ii

    //时间复杂度O(n) 空间复杂度O(n) 
        public int[] sortArrayByParityII(int[] A) {
            //错误的奇数索引
            List<Integer> errorOddNumber = new ArrayList<>();
    
            //错误的偶数索引
            List<Integer> errorEvenNumber = new ArrayList<>();
    
            for(int i = 0; i < A.length; i++){
                if(i%2 ==0){ //是偶数索引吗?
                    if(A[i] % 2 != 0){ //值是否为偶数
                        errorEvenNumber.add(i);
                    }
                } else {
                    if(A[i] % 2 != 1){ //值是否为奇数
                        errorOddNumber.add(i);
                    }
                }
            }
    
            int i = 0;
            int temp  = 0;
            //对奇偶数交换
            while(i<errorEvenNumber.size() && i < errorOddNumber.size()){
                int a = errorEvenNumber.get(i);
                int b = errorOddNumber.get(i);
                temp = A[a];
                A[a] = A[b];
                A[b] = temp;
                i++;
            }
            return A;
        }

    时间复杂度:O(n)

    空间复杂度:O(1)

    //有没有办法做到不使用额外的空间?
        //使用双指针
        public int[] sortArrayByParityII(int[] A) {
            
            //奇数索引的指针
            int oddIndex = 1;
            //偶数索引的指针
            int evenIndex = 0;
    
            //每次挪动两步,为了保证都是走的同种类型的索引
            for(;evenIndex < A.length ; evenIndex+=2){
                //如果偶数索引对应的并非是偶数的值
                if(A[evenIndex]%2 != 0){
                    for(;oddIndex < A.length;oddIndex+=2){
                        //那么找到同种类型的不满足的奇数索引,将两个置换
                        if(A[oddIndex]%2 != 1){
                            swap(A,evenIndex,oddIndex);
                            break;
                        }
                    }
                }
            }
            return A;
        }
    
        private void swap(int[] A, int a, int b){
            int temp = A[a];
            A[a] = A[b];
            A[b] = temp;
        }
    一个入行不久的Java开发,越学习越感觉知识太多,自身了解太少,只能不断追寻
  • 相关阅读:
    Android 代码规范大全
    python爬虫学习系列
    python接口测试(requests+excel)
    Jenkins系列
    postman系列
    利用Faker生成常用的测试数据
    python基础在实际写脚本过程中的一些简单运用(一)
    charles实践-通过断点调试修改request
    关于fiddler抓包的一些配置
    c#winform主题实现的一个方法
  • 原文地址:https://www.cnblogs.com/fengtingxin/p/13962352.html
Copyright © 2011-2022 走看看