前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode148|颜色分类

LeetCode148|颜色分类

作者头像
码农王同学
发布2021-01-15 10:56:25
2030
发布2021-01-15 10:56:25
举报
文章被收录于专栏:后端Coder后端Coder

一,颜色分类

1,问题简述

给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。

进阶:

你可以不使用代码库中的排序函数来解决这道题吗?你能想出一个仅使用常数空间的一趟扫描算法吗?

2,示例描述

代码语言:javascript
复制
示例 1:

输入:nums = [2,0,2,1,1,0]
输出:[0,0,1,1,2,2]
示例 2:

输入:nums = [2,0,1]
输出:[0,1,2]
示例 3:

输入:nums = [0]
输出:[0]
示例 4:

输入:nums = [1]
输出:[1]
 

提示:

n == nums.length
1 <= n <= 300
nums[i] 为 0、1 或 2

 

3,题解思路

基于双指针的思路进行实现,基于键值对集合进行实现

4,题解程序

代码语言:javascript
复制
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.Map;

public class SortColorsTest2 {
    public static void main(String[] args) {
        int[] nums = {2, 0, 2, 1, 1, 0};
        sortColors(nums);
        System.out.println();
        for (int num : nums) {
            System.out.print(num + "\t");
        }
    }

    public static void sortColors(int[] nums) {
        if (nums == null || nums.length == 0) {
            return;
        }
        int left = 0;
        int right = nums.length - 1;
        for (int i = 0; i <= right; ) {
            if (nums[i] == 0) {
                int temp = nums[left];
                nums[left] = nums[i];
                nums[i] = temp;
                ++left;
                ++i;
            } else if (nums[i] == 2) {
                int temp = nums[right];
                nums[right] = nums[i];
                nums[i] = temp;
                --right;
            } else {
                ++i;
            }
        }
    }

    public static void sortColors2(int[] nums) {
        if (nums == null || nums.length == 0) {
            return;
        }
        Arrays.sort(nums);
        Map<Integer, Integer> map = new LinkedHashMap<>();
        for (int num : nums) {
            if (map.containsKey(num)) {
                map.put(num, map.get(num) + 1);
            } else {
                map.put(num, 1);
            }
        }
        Arrays.fill(nums, 0);
        int[] result = new int[nums.length];
        int index = 0;
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            Integer value = entry.getValue();
            while (value > 0) {
                result[index++] = entry.getKey();
                value--;
            }
        }
        System.arraycopy(result, 0, nums, 0, result.length);
    }
}


5,总结一下

这题有两种思路进行解决,一个是基于双指针的思路进行解决,一个是基于键值对集合hashmap进行解决,两种方式都可以实现。

历史文章目录

数据结构:王同学下半年曾写过的JDK集合源码分析文章汇总

算法汇总:leetcode刷题汇总(非最终版)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农王同学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一,颜色分类
    • 1,问题简述
      • 2,示例描述
        • 3,题解思路
          • 4,题解程序
            • 5,总结一下
              • 历史文章目录
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档