[LeetCode.922] 按奇偶排序数组 II

6 篇文章 0 订阅
6 篇文章 0 订阅

LeetCode 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

解题思路一

  1. 创建新列表B。
  2. 逐一取出A中符合B列表当前奇偶性的A列表数字添加到B列表。

比如数据 [4,2,5,7],首先是4,添加到B[0]中,A列表变更为[2,5,7]。其次是2,不符合要求,往后寻找第一个奇数是5,添加到B[1],A列表变更为[2,7]。这个思路核心是A列表的长度是变化的,要控制好列表的下标,不要出现超限错误。

class Solution:
    def sortArrayByParityII(self, A):
        """
        :type A: List[int]
        :rtype: List[int]
        """
        i=0
        B=[]
        for i in range(len(A)):
            if (i % 2) == A[0] % 2:
                B.append(A.pop(0))
            else:
                j=0
                while j<len(A): # A列表长度是变化的,要用while循环
                    if i % 2 == A[j] % 2:
                        B.append(A.pop(j))
                        break   # 添加成功后,退出循环
                    else:
                        j += 1
        return B
        

由于涉及循环嵌套,算法复杂度为 O(n2),提交后效果不好,用时在后2%。

61 / 61 个通过测试用例
执行用时:824 ms
执行用时战胜1.91%的提交记录

解题思路二

这个是看别人的思路,特别粗暴

  1. A[]中的偶数和奇数分别取出来,放在EvenNum[]OddNum[]中。
  2. 依次将EvenNum[]OddNum[]中的数放入B[]中。
class Solution:
    def sortArrayByParityII(self, A):
        """
        :type A: List[int]
        :rtype: List[int]
        """
        B=[]
        EvenNum=[]
        OddNum=[]
        for i in range(len(A)):
            if A[i] % 2 == 0:
                EvenNum.append(i)
            else:
                OddNum.append(i)
        for i in range(len(EvenNum)):
            B.append(A[EvenNum[i]])
            B.append(A[OddNum[i]])
        return B

有两个循环,复杂度为 O(n)。提交执行用时排名在14%以内。

61 / 61 个通过测试用例
执行用时:168 ms
执行用时战胜 87.62% 的提交记录

解题思路三

这个是大神的思路,前1%。

  1. 创建一个和A[]一样长度的全零列表B[]
  2. 直接把A[]的元素往B[]中填,偶数就填到偶数位,奇数就填到奇数位。
class Solution:
    def sortArrayByParityII(self, A):
        """
        :type A: List[int]
        :rtype: List[int]
        """
        i = 0
        j = 1
        ans = [0] * len(A)
        for num in A:
            if num % 2 == 0:
                ans[i] = num
                i += 2
            else:
                ans[j] = num
                j += 2
        return ans

这个思路更好,只用循环一次,复杂度为 O(n)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值