LeetCode 75. 颜色分类(Medium)/ 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面(Easy)/ 大小写字母左右移动 / 元素移动问题!!!

  • 283. 移动零(原地移动到数组末尾)(Easy)
  • 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面(Easy)
  • 【原地】大小写字母左右移动
  • 26.【原地】删除排序数组中的重复项(Easy)
    LeetCode 75. 颜色分类(Medium)/ 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面(Easy)/ 大小写字母左右移动 / 元素移动问题!!!_第1张图片
    题目链接

题解

  1. 颜色分类

思路

LeetCode 75. 颜色分类(Medium)/ 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面(Easy)/ 大小写字母左右移动 / 元素移动问题!!!_第2张图片
LeetCode 75. 颜色分类(Medium)/ 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面(Easy)/ 大小写字母左右移动 / 元素移动问题!!!_第3张图片
在这里插入图片描述

代码

class Solution:
    ### 0123 单指针(32 ms,14.9 MB)
    def sortColors(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        n = len(nums)
        p = 0

        # 先交换0
        for i in range(n):
            if nums[i] == 0:
                nums[p], nums[i] = nums[i], nums[p]
                p += 1
        
        # 0交换完之后,再交换1
        for i in range(n):
            if nums[i] == 1:
                nums[p], nums[i] = nums[i], nums[p]
                p += 1

        return nums

    ### 0123 双指针(40 ms,14.9 MB)
    def sortColors(self, nums: List[int]) -> None:
        n = len(nums)
        # 初始化双指针为0,其中p1每遍历一个数都向前移动
        p0 = p1 = 0

        for i in range(n):
            # 先交换1
            if nums[i] == 1:
                nums[p1], nums[i] = nums[i], nums[p1]
                p1 += 1
            # 再交换0
            elif nums[i] == 0:
                nums[p0], nums[i] = nums[i], nums[p0]
                # 若p0 < p1,则此时交换出去的是最前面的1
                # 需要进行第二次交换,把1交换回来
                if p0 < p1:
                    nums[p1], nums[i] = nums[i], nums[p1]
                p0 += 1
                p1 += 1

        return nums

你可能感兴趣的:(LeetCode,leetcode,算法,职场和发展)