Leetcode Link: 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 - 力扣(LeetCode)

题目

解法一:同向双指针

思路: 一个指针 bound,用来指示前面奇数的边界(含) 一个指针 p,用来指示当前遍历位置

  1. 当前为奇数: bound++,并且 nums[bound]nums[p]
  2. 为偶数:无操作

题解

class Solution:
    def exchange(self, nums: List[int]) -> List[int]:
        p = 0
        bound = -1
 
        while(p<len(nums)):
            if nums[p] % 2 == 1:
                bound += 1
                nums[bound], nums[p] = nums[p] ,nums[bound]
            p += 1
        
        return nums

解法二:对向双指针

思路: 定义奇数边界 left 和偶数边界 right,其中奇数边界不含边界,偶数边界含边界。

小于奇数边界的都是奇数,大于偶数边界的都是偶数。

题解

class Solution:
    def exchange(self, nums: List[int]) -> List[int]:
        left = 0   # 奇数边界,不含
        right = len(nums) # 偶数边界,含
        while(left != right):
            if nums[left] % 2 == 1:
                left += 1
            else:
                right -= 1
                nums[left], nums[right] = nums[right], nums[left]
        return nums
 

启发和联系

无论使用哪种策略,务必注意边界是否包含,以及while 内的跳出条件,一定要做到无遗漏,无重复!