欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LeetCode--75.颜色分类(C)

程序员文章站 2022-06-03 11:20:46
...

1. 题目描述

难度:中等
LeetCode--75.颜色分类(C)

2. 题目解析

这道题需要注意一下几点:

  • 原地进行排序,不可以另外申请数组空间。
  • 数组元素最多只有三个元素0, 1, 2,但是要考虑空数组和单个元素的例子

有两种方法:

  • 计数排序法
    遍历出0,1,2元素的个数,然后按照这个个数重新写入数组,时间复杂度为O(n).
  • 三路快排法
    三路快排思想,就是大于1的放右边,小于1的放左边,等于1的不动,这样只遍历一遍就可以了,时间复杂度为O(n)

3. C语言实现

3.1 三路快排法

代码如下:

// 交换两个对象
void swap(int* nums, int a, int b){
    int temp;
    temp = nums[a];
    nums[a] = nums[b];
    nums[b] = temp;
}
void sortColors(int* nums, int numsSize){
    int i, left, right;
    i = 0;
    left = -1;
    right = numsSize;
    while(i < right){
    	// 如果元素=0,将该元素放在数组前面
        if(nums[i] == 0){
            left++;
            swap(nums, i, left);
            i++;
        }
        // 如果元素=2,将元素放在数组后面
        else if(nums[i] == 2){
            right--;
            swap(nums, right, i);
        }
        else
            i++;
    }
}

运行结果为:
LeetCode--75.颜色分类(C)

3.2 计数排序法

代码如下:

void sortColors(int* nums, int numsSize){
    int i, r=0, w=0, b=0;
    for(i = 0; i < numsSize; i++){
        if(nums[i] == 0) r++;
        else if(nums[i] == 1) w++;
        else b++;
    }
    for(i = 0; i < numsSize; i++){
        if(i < r) nums[i] = 0;
        else if(i >= r && i < r+w) nums[i] = 1;
        else nums[i] = 2;
    }
}

运行结果为:
LeetCode--75.颜色分类(C)

相关标签: # •Array