返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++实现LeetCode(75.颜色排序)
  • 744
分享到

C++实现LeetCode(75.颜色排序)

2024-04-02 19:04:59 744人浏览 独家记忆
摘要

[LeetCode] 75. Sort Colors 颜色排序 Given an array with n objects colored red, white

[LeetCode] 75. Sort Colors 颜色排序

Given an array with n objects colored red, white or blue, sort them in-place so that objects of the same color are adjacent, with the colors in the order red, white and blue.

Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively.

Note: You are not suppose to use the library's sort function for this problem.

Example:

Input: [2,0,2,1,1,0]
Output: [0,0,1,1,2,2]

Follow up:

  • A rather straight forward solution is a two-pass alGorithm using counting sort.
    First, iterate the array counting number of 0's, 1's, and 2's, then overwrite array with total number of 0's, then 1's and followed by 2's.
  • Could you come up with a one-pass algorithm using only constant space?

这道题的本质还是一道排序的题,题目中给出提示说可以用计数排序,需要遍历数组两遍,那么先来看这种方法,因为数组中只有三个不同的元素,所以实现起来很容易。

- 首先遍历一遍原数组,分别记录 0,1,2 的个数。
- 然后更新原数组,按个数分别赋上 0,1,2。

解法一:


class Solution {
public:
    void sortColors(vector<int>& nums) {
        vector<int> colors(3);
        for (int num : nums) ++colors[num];
        for (int i = 0, cur = 0; i < 3; ++i) {
            for (int j = 0; j < colors[i]; ++j) {
                nums[cur++] = i;
            }
        }
    }
};

题目中还要让只遍历一次数组来求解,那么就需要用双指针来做,分别从原数组的首尾往中心移动。

- 定义 red 指针指向开头位置,blue 指针指向末尾位置。

- 从头开始遍历原数组,如果遇到0,则交换该值和 red 指针指向的值,并将 red 指针后移一位。若遇到2,则交换该值和 blue 指针指向的值,并将 blue 指针前移一位。若遇到1,则继续遍历。

解法二:


class Solution {
public:
    void sortColors(vector<int>& nums) {
        int red = 0, blue = (int)nums.size() - 1;
        for (int i = 0; i <= blue; ++i) {
            if (nums[i] == 0) {
                swap(nums[i], nums[red++]);
            } else if (nums[i] == 2) {
                swap(nums[i--], nums[blue--]);
            } 
        }
    }
};

当然我们也可以使用 while 循环的方式来写,那么就需要一个变量 cur 来记录当前遍历到的位置,参见代码如下:

解法三:


class Solution {
public:
    void sortColors(vector<int>& nums) {
        int left = 0, right = (int)nums.size() - 1, cur = 0;
        while (cur <= right) {
            if (nums[cur] == 0) {
                swap(nums[cur++], nums[left++]);
            } else if (nums[cur] == 2) {
                swap(nums[cur], nums[right--]);
            } else {
                ++cur;
            }
        }
    }
};

到此这篇关于c++实现LeetCode(75.颜色排序)的文章就介绍到这了,更多相关C++实现颜色排序内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++实现LeetCode(75.颜色排序)

本文链接: https://lsjlt.com/news/130679.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++实现LeetCode(75.颜色排序)
    [LeetCode] 75. Sort Colors 颜色排序 Given an array with n objects colored red, white ...
    99+
    2024-04-02
  • C++怎么实现颜色排序
    这篇文章主要介绍了C++怎么实现颜色排序的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++怎么实现颜色排序文章都会有所收获,下面我们一起来看看吧。颜色排序Example:Input: [2,0,2,1,1,0...
    99+
    2023-06-19
  • C++实现LeetCode(60.序列排序)
    [LeetCode] 60. Permutation Sequence 序列排序 The set [1,2,3,...,n] contains a total o...
    99+
    2024-04-02
  • C++实现LeetCode(148.链表排序)
    [LeetCode] 148. Sort List 链表排序 Sort a linked list in O(n log n) time using c...
    99+
    2024-04-02
  • C++实现LeetCode(143.链表重排序)
    [LeetCode] 143.Reorder List 链表重排序 Given a singly linked list L: L0→L1→…→Ln-1→Ln, ...
    99+
    2024-04-02
  • C++实现LeetCode(147.链表插入排序)
    [LeetCode] 147. Insertion Sort List 链表插入排序 Sort a linked list using insertion sort. A graph...
    99+
    2024-04-02
  • C++实现LeetCode(769.可排序的最大块数)
    [LeetCode] 769.Max Chunks To Make Sorted 可排序的最大块数 Given an array arr that is a pe...
    99+
    2024-04-02
  • C++实现LeetCode(46.全排列)
    [LeetCode] 46. Permutations 全排列 Given a collection of distinct integers, return a...
    99+
    2024-04-02
  • C# wpf简单颜色板的实现
    目录前言一、如何实现?1、使用ObjectDataProvider2、定义转换器3、绑定容器二、使用示例1.代码2.显示效果前言 wpf本身没有提供颜色板之类的控件,有些业务使用场...
    99+
    2024-04-02
  • C++实现LeetCode(768.可排序的最大块数之二)
    [LeetCode] 768.Max Chunks To Make Sorted II 可排序的最大块数之二 This question is the same as "Max Ch...
    99+
    2024-04-02
  • C++实现LeetCode(31.下一个排列)
    [LeetCode] 31. Next Permutation 下一个排列 Implement next permutation, which rearranges num...
    99+
    2024-04-02
  • C++实现LeetCode(47.全排列之二)
    [LeetCode] 47. Permutations II 全排列之二 Given a collection of numbers that might contain dupli...
    99+
    2024-04-02
  • python实现颜色空间转换程序(Tkinter)
    本文主要基于colorsys实现,样例是从hls转换到rgb,如果要换颜色空间很容易只需要修改一个函数,具体内容如下 用到了Scale和Canvas组件。 运行效果图: 代码如下: from Tki...
    99+
    2022-06-04
    转换程序 颜色 空间
  • c# 颜色选择控件的实现代码
    参考ColorComboBox做修改,并对颜色名做些修正,用于CR MVMixer产品中,聊作备忘~ 效果图: 代码: //颜色拾取框 using System; using ...
    99+
    2024-04-02
  • C#实现希尔排序
    对于大规模乱序的数组,插入排序很慢,因为它只会交换相邻的元素,因此元素只能一点一点地从数组地一段移动到另一端。希尔排序改进了插入排序,交换不相邻地元素以对数组地局部进行排序,最终用插...
    99+
    2024-04-02
  • C#实现归并排序
    什么是归并?即将两个有序的数组归并成一个更大的有序数组。 什么是归并排序?先将要排序的数组递归地分成两半分别排序,然后将结果归并起来。 归并排序能够保证将任意大小为 N 的数组排序所...
    99+
    2024-04-02
  • C++如何实现序列排序
    这篇文章主要讲解了“C++如何实现序列排序”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++如何实现序列排序”吧!Permutation Sequence 序列排序The set ...
    99+
    2023-06-19
  • opencv实现颜色检测
    本文实例为大家分享了opencv实现颜色检测的具体代码,供大家参考,具体内容如下 若要在OPencv 中实现颜色检测,首先要将待检测图像转换到HSV颜色空间中,但因为颜色是一个特定的...
    99+
    2024-04-02
  • C#中WPF颜色对话框控件的实现
    在 C# WPF开发中颜色对话框控件(ColorDialog)用于对界面中的背景、文字…(拥有颜色属性的所有控件)设置颜色,例如设置标签控件的背景色。 颜色对话框的运行...
    99+
    2024-04-02
  • C++中怎么使用cvtColor实现颜色转换
    这篇文章主要讲解了“C++中怎么使用cvtColor实现颜色转换”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++中怎么使用cvtColor实现颜色转换”吧!前言在我们读取图像时通常会用到...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作