这是悦乐书的第354次更新,第379篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第216题(顺位题号是922)。给定非负整数的数组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

02 第一种解法

使用两个List将奇数、偶数分别存起来,创建一个新的数组result,如果索引为奇数,就从存奇数的List中取值作为新数组的元素,反之就从存偶数的List中取值作为新数组的元素。

此解法的时间复杂度是O(N),空间复杂度是O(N)

public int[] sortArrayByParityII(int[] A) {
List<Integer> odd = new ArrayList<Integer>();
List<Integer> even = new ArrayList<Integer>();
for (int num : A) {
if (num%2 == 0) {
even.add(num);
} else {
odd.add(num);
}
}
int j = 0, k = 0;
int[] result = new int[A.length];
for (int i=0; i<result.length; i++) {
if (i%2 == 0) {
result[i] = even.get(j++);
} else {
result[i] = odd.get(k++);
}
}
return result;
}

03 第二种解法

我们也可以直接从A中取值,同样是新建一个result数组,对result数组新建两个索引,一个从0开始,只做偶数索引,另一个从1开始,只做奇数索引,分两次遍历A数组,将对应的元素和索引值存入result中。

此解法的时间复杂度是O(N),空间复杂度是O(N)

public int[] sortArrayByParityII2(int[] A) {
int[] result = new int[A.length];
int j = 0;
for (int i=0; i<A.length; i++) {
if (A[i]%2 == 0) {
result[j] = A[i];
j += 2;
}
}
int k = 1;
for (int i=0; i<A.length; i++) {
if (A[i]%2 != 0) {
result[k] = A[i];
k += 2;
}
}
return result;
}

04 第三种解法

针对上面的第二种解法,我们也可以只使用一次循环。

此解法的时间复杂度是O(N),空间复杂度是O(N)

public int[] sortArrayByParityII3(int[] A) {
int[] result = new int[A.length];
int j = 0, k = 1;
for (int i=0; i<A.length; i++) {
if (A[i]%2 == 0) {
result[j] = A[i];
j += 2;
} else {
result[k] = A[i];
k += 2;
}
}
return result;
}

05 第四种解法

双指针。

定义两个指针i和j,i代表偶数索引,从0开始;j代表奇数索引,从n-1开始(n为数组A的length),如果偶数索引位置对应的元素为奇数,且奇数索引位置对应的元素为偶数,就进行元素交换。如果偶数索引位置对应的元素为偶数,偶数索引i就加2,同理,奇数索引位置对应的元素为奇数,奇数索引j就减2,循环结束条件为i不小于n或者j小于1。

此解法的时间复杂度是O(N),空间复杂度是O(1)

public int[] sortArrayByParityII4(int[] A) {
int i = 0, j = A.length-1, n = A.length;
while (i < n && j >= 1) {
if (A[i]%2 == 1 && A[j]%2 == 0) {
int tem = A[j];
A[j] = A[i];
A[i] = tem;
}
if (A[i]%2 == 0) {
i += 2;
}
if (A[j]%2 == 1) {
j -= 2;
}
}
return A;
}

06 小结

算法专题目前已连续日更超过六个月,算法题文章222+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode.922-按奇偶排序数组 II(Sort Array By Parity II)的更多相关文章

  1. [Swift]LeetCode922.按奇偶排序数组 II | Sort Array By Parity II

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

  2. 每日一题20201112(922. 按奇偶排序数组 II)

    题目链接: 922. 按奇偶排序数组 II 思路 很简单,搞懂问题的核心就行,假设现在有奇数在偶数位上,偶数在奇数位上. 那么我们要做的就是,找到分别在对方位置上的数字,然后交换他们就行. class ...

  3. 【LEETCODE】42、922. Sort Array By Parity II

    package y2019.Algorithm.array; /** * @ProjectName: cutter-point * @Package: y2019.Algorithm.array * ...

  4. LeetCode 922. Sort Array By Parity II C++ 解题报告

    922. Sort Array By Parity II 题目描述 Given an array A of non-negative integers, half of the integers in ...

  5. 992. Sort Array By Parity II - LeetCode

    Question 992. Sort Array By Parity II Solution 题目大意:给一个int数组,一半是奇数一半是偶数,分别对偶数数和奇数数排序并要求这个数本身是偶数要放在偶数 ...

  6. 【Leetcode_easy】922. Sort Array By Parity II

    problem 922. Sort Array By Parity II solution1: class Solution { public: vector<int> sortArray ...

  7. [LeetCode] 922. Sort Array By Parity II 按奇偶排序数组之二

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

  8. Sort Array By Parity II LT922

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

  9. 【LeetCode】922. Sort Array By Parity II 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 使用奇偶数组 排序 奇偶数位置变量 日期 题目地址: ...

随机推荐

  1. 基于Redis实现分布式锁(转载)

    原文地址:http://blog.csdn.net/ugg/article/details/41894947 Redis命令介绍使用Redis实现分布式锁,有两个重要函数需要介绍 SETNX命令(SE ...

  2. python继承小demo

    # -*- coding: utf-8 -*- """ 继承的意义:实现代码重用,数据函数都可以重用 子类覆盖,子类与父类同名 选择性继承 super().__init_ ...

  3. maven在eclipse运行命令和calss文件没有更新的问题

    使用Eclipse Maven插件[Run As]-[Maven build]时并未为其指定goal或phase 解决方法:  1.使用Eclipse Maven插件[Run As]-[Maven b ...

  4. js 设置多条css样式

    如果在一个网页中给id="mydiv"的元素添加css样式,先获取该节点:var obj = document.getElementById("mydiv"); ...

  5. promise,await,async小论

    Promise: Promise为了解决异步回调地狱而生的,其解决方法就是链式调用promise.then()或promise.all(); Promise有两个参数,resolve和reject,第 ...

  6. C# 常用方法——图片转base64字符串

    其他扩展方法详见:https://www.cnblogs.com/zhuanjiao/p/12060937.html /// <summary> /// Image 转成 base64 / ...

  7. 【杂题】[AGC034D] Manhattan Max Matching【费用流】

    Description 有一个无限大的平面,有2N个位置上面有若干个球(可能重复),其中N个位置是红球,N个位置是蓝球,红球与蓝球的总数均为S. 给出2N个位置和上面的球数,现要将红球与蓝球完美匹配, ...

  8. linux下简单好用的端口映射转发工具rinetd

    linux下简单好用的工具rinetd,实现端口映射/转发/重定向官网地址http://www.boutell.com/rinetd 软件下载wget http://www.boutell.com/r ...

  9. 【BZOJ3545&BZOJ3551】Peaks(kruskal重构树,主席树,dfs序)

    题意:在Bytemountains有N座山峰,每座山峰有他的高度h_i. 有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走, 现在有Q组询问,每组询问询问从点v开始只 ...

  10. JavaWeb_(SSH论坛)_七、辅助模块

    基于SSH框架的小型论坛项目 一.项目入门 传送门 二.框架整合 传送门 三.用户模块 传送门 四.页面显示 传送门 五.帖子模块 传送门 六.点赞模块 传送门 七.辅助模块 传送门 为避免代码冗余, ...