这是悦乐书的第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)

  1. public int[] sortArrayByParityII(int[] A) {
  2. List<Integer> odd = new ArrayList<Integer>();
  3. List<Integer> even = new ArrayList<Integer>();
  4. for (int num : A) {
  5. if (num%2 == 0) {
  6. even.add(num);
  7. } else {
  8. odd.add(num);
  9. }
  10. }
  11. int j = 0, k = 0;
  12. int[] result = new int[A.length];
  13. for (int i=0; i<result.length; i++) {
  14. if (i%2 == 0) {
  15. result[i] = even.get(j++);
  16. } else {
  17. result[i] = odd.get(k++);
  18. }
  19. }
  20. return result;
  21. }

03 第二种解法

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

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

  1. public int[] sortArrayByParityII2(int[] A) {
  2. int[] result = new int[A.length];
  3. int j = 0;
  4. for (int i=0; i<A.length; i++) {
  5. if (A[i]%2 == 0) {
  6. result[j] = A[i];
  7. j += 2;
  8. }
  9. }
  10. int k = 1;
  11. for (int i=0; i<A.length; i++) {
  12. if (A[i]%2 != 0) {
  13. result[k] = A[i];
  14. k += 2;
  15. }
  16. }
  17. return result;
  18. }

04 第三种解法

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

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

  1. public int[] sortArrayByParityII3(int[] A) {
  2. int[] result = new int[A.length];
  3. int j = 0, k = 1;
  4. for (int i=0; i<A.length; i++) {
  5. if (A[i]%2 == 0) {
  6. result[j] = A[i];
  7. j += 2;
  8. } else {
  9. result[k] = A[i];
  10. k += 2;
  11. }
  12. }
  13. return result;
  14. }

05 第四种解法

双指针。

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

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

  1. public int[] sortArrayByParityII4(int[] A) {
  2. int i = 0, j = A.length-1, n = A.length;
  3. while (i < n && j >= 1) {
  4. if (A[i]%2 == 1 && A[j]%2 == 0) {
  5. int tem = A[j];
  6. A[j] = A[i];
  7. A[i] = tem;
  8. }
  9. if (A[i]%2 == 0) {
  10. i += 2;
  11. }
  12. if (A[j]%2 == 1) {
  13. j -= 2;
  14. }
  15. }
  16. return A;
  17. }

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. 在哪里查看java的jar包版本?

    jar包根目录里的META-INF目录下的MANIFEST.MF文件里一般有会记录版本信息,可以到这个文件里查看 .

  2. Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建胜过Apache十倍的Web服务器

    [文章作者:张宴 本文版本:v6.3 最后修改:2010.07.26 转载请注明原文链接:http://blog.zyan.cc/nginx_php_v6/] 前言:本文是我撰写的关于搭建“Nginx ...

  3. 使用sql做迁移矩阵

    在数据分析数据差异的时候 经常用到一个图叫做迁移矩阵. 其中里面的值可以是数量也可以是百分比,我们可以从一个时间点明确的看到在另一个时间点或者另一个时间点 子类之间数量迁移. 比如这次我在公司与业务核 ...

  4. spring容器BeanFactory简单例子

    在Spring中,那些组成你应用程序的主体及由Spring Ioc容器所管理的对象,都被称之为bean.简单来讲,bean就是Spring容器的初始化.配置及管理的对象.除此之外,bean就与应用程序 ...

  5. 29.连续子数组的最大和(python)

    题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量 ...

  6. Java枚举类的7种常用的方法

    转载于:https://www.cnblogs.com/xhlwjy/p/11314368.html

  7. vs 2019 调试web项目 浏览器

  8. js 创建节点 以及 节点属性 删除节点

    case 'copy': var B1 = document.getElementById("B1"); //获得B1下的html文本 var copy_dom = documen ...

  9. 计算机网络(十二),Socket简介

    目录 1.Socket简介 2.Socket工作原理 十二.Socket简介 1.Socket简介 2.Socket工作原理

  10. css grid 随笔

    原文出自Arien的博客https://www.w3cplus.com/css3/line-base-placement-layout.html 首先定义一个网格 1.可以给父容器的display属性 ...