力扣第 75 题是 颜色分类

题目描述

输入 :一个数组 nums,其中元素只能是 0、1 和 2。

输出:对数组进行排序,使其按顺序排列。

你需要使用 原地算法,即不能使用额外的空间来完成排序。


示例

示例 1

输入:

plaintext 复制代码
nums = [2, 0, 2, 1, 1, 0]

输出:

plaintext 复制代码
[0, 0, 1, 1, 2, 2]
示例 2

输入:

plaintext 复制代码
nums = [2, 0, 1]

输出:

plaintext 复制代码
[0, 1, 2]

解题思路

1. 计数排序
  • 遍历数组,统计 0、1、2 的个数。
  • 然后按照统计的数量依次将 0、1、2 填回数组。

这种方法需要两次遍历,时间复杂度为 O(n) ,空间复杂度为 O(1)。


2. 双指针法

使用三个指针:

  • p0:指向下一个应该放置 0 的位置。
  • p2:指向下一个应该放置 2 的位置。
  • curr:用于遍历数组。

算法过程:

  1. 初始化 p0 = 0,curr = 0,p2 = n - 1。
  2. 遍历数组:
    • 如果 nums[curr] == 0:将 nums[curr] 与 nums[p0] 交换,p0++,curr++。
    • 如果 nums[curr] == 2:将 nums[curr] 与 nums[p2] 交换,p2--,但此时 curr 不前进(因为交换过来的元素还需要检查)。
    • 如果 nums[curr] == 1:curr++。

这种方法只需一次遍历,时间复杂度为 O(n) ,空间复杂度为 O(1)。


实现代码

双指针法实现
c 复制代码
#include <stdio.h>

void sortColors(int* nums, int numsSize) {
    int p0 = 0, curr = 0, p2 = numsSize - 1;

    while (curr <= p2) {
        if (nums[curr] == 0) {
            // 交换 nums[curr] 和 nums[p0]
            int temp = nums[curr];
            nums[curr] = nums[p0];
            nums[p0] = temp;
            p0++;
            curr++;
        } else if (nums[curr] == 2) {
            // 交换 nums[curr] 和 nums[p2]
            int temp = nums[curr];
            nums[curr] = nums[p2];
            nums[p2] = temp;
            p2--;
        } else {
            curr++;
        }
    }
}

int main() {
    int nums[] = {2, 0, 2, 1, 1, 0};
    int numsSize = sizeof(nums) / sizeof(nums[0]);

    sortColors(nums, numsSize);

    // 输出排序后的数组
    for (int i = 0; i < numsSize; i++) {
        printf("%d ", nums[i]);
    }
    printf("\n");

    return 0;
}

代码解析

  1. 变量初始化:

    • p0 指向当前应该放 0 的位置。
    • p2 指向当前应该放 2 的位置。
    • curr 遍历数组。
  2. 循环逻辑:

    • 如果 nums[curr] == 0:
      • 交换 nums[curr] 和 nums[p0]。
      • 更新 p0 和 curr。
    • 如果 nums[curr] == 2:
      • 交换 nums[curr] 和 nums[p2]。
      • 更新 p2。
    • 如果 nums[curr] == 1:
      • 直接更新 curr。
  3. 结束条件:

    • 当 curr > p2 时,所有元素已经按要求排序。

时间复杂度和空间复杂度

  • 时间复杂度:

    • 只需一次遍历,时间复杂度为 O(n)。
  • 空间复杂度:

    • 没有使用额外的空间,空间复杂度为 O(1)。
相关推荐
stsdddd1 小时前
YOLO算法建筑工地安全帽目标检测数据集16881张:标注核对笔记
算法·yolo·目标检测
CV爱数码2 小时前
论文精读|Learned Primal-Dual:把原始–对偶算法展开成网络
图像处理·算法·计算机视觉·ct·重建·断层扫描
yuniko-n2 小时前
【算法】约瑟夫环问题
java·算法
郝亚军2 小时前
manifest 中 `sha256` 与 `signValue` 的作用
java·开发语言·数据结构
l1t2 小时前
测试DuckDB v2.1.0-alpha49002的bignum乘法
数据库·sql·算法·duckdb
Nil2083 小时前
LeetCode 283移动零
数据结构·算法·leetcode
CQU_JIAKE3 小时前
10.18【A】
算法
LMT流氓兔3 小时前
第五单元——第4课:给工具参数加校验
java·前端·算法·ai·langchain
文丑颜不良啊4 小时前
LeetCode226~250题目解析
java·leetcode
物联网软硬件开发-轨物科技4 小时前
【轨物方案】深度解读开关柜智能感知及一键顺控专家系统
大数据·运维·网络·人工智能·算法·机器人