蓝桥杯---颜色分类(leetcode第75题)题解

文章目录

1.问题重述

颜色分类,实际上就是赋予了三种颜色不同的数值,0,1,2分别代表的就是一个类型的颜色,我们题目说的是对于颜色进行分类,实际上就是对于0,1,2进行分类,我们把很多数字(其中这个里面包含了0,1,2)混合起来,然后需要按照规则对于这个里面的数据进行分类展示,返回分类之后的结果数组;

因为这个给的示例很容易理解,所以我就直接放在这个第一个话题下面了,下面我们就直接分析这个题目的思路:其实这个实例就是0放到最左边,1放到这串数据的中间,而这个2放到我们的最右边;

2.思路分析

我们通过i,left,right把这个数组分成了几个部分,每一个部分代表着不同的含义,例如这个i就是进行遍历我们这个数据的;

0全部放置到left左侧的区域;

2全部放置到right右边的区域;

left和i之间放置的就是1这个元素;

i和right之间的就是还没有进行分类的元素;

上面的这个就是我们进行分类的思路,如下图所示:

因为我们的i是负责扫描的,因此这个i可能会扫描到不同的数值,分别是0,1,2,对于不同的数值,我们需要采取不同的解决方案;

如果扫描到0,这个时候需要把它放到我们的left左边,因此这个时候让i指向的元素和left+1下标的元素进行交换,这个时候把0换到我们的left的左边的区域,然而这个i需要右移一下(因为从left+1交换过来的元素是1,我们的i扫描的时候应该是没有分类的元素,因此这个需要i++)

我们可以验证一下,即使这个i就是left+1下标,这个时候的交换就是我们的i自己和自己的交换,上面的这个思路依然是符合题目要求的;

如果扫描大1,这个时候就正合我意,因为我们上面已经说了,这个left和i之间的就是我们的1,因此这个时候i++移动一下继续扫描就可以了;

如果扫描到2,这个时候需要放到right的右边位置,也就是i和right-1下标进行交换,这个时候i交换过来的是right-1位置的元素,这个元素是没有分类的,因此这个不能像第一类里面的那个样子i再移动了,这个情况下我们的i原地不动,因为这个i指向的就是没有分类的元素;

3.代码分析

其实上面的这个思路复杂,可能需要我们进行讨论的这个情况比较多,但是这个代码真的很简单;

首先,我们需要定义一个swap函数,其实就是我们最开始学习C语言的时候,通过一个中间变量temp进行两个数据的交换;

接下来代码里面的if else就是根据这个i指向的不同的元素进行交换和移动就可以了,和上面的思路就是一样的;

其实我觉得通过这个题目我们可以反思一下:

其实这个题目的代码无非就是if else else,然后最上面就是我们学习C语言的时候就非常熟悉的两个数据交换的代码,就是这么简单的元素的拼合,就是这个算法题目的答案,是不是觉得也挺不可思议的,对于像我这样的小白而言,我觉得很震惊,这个里面的代码的逻辑并不是很复杂,但是这个从题目---》实现的过程的这个思路,实现,才是我们真正缺少的,应该反复实践的;

相关推荐
To_OC5 天前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC5 天前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode
To_OC6 天前
LC 994 腐烂的橘子:人人都说是 BFS 入门题,我却写了三遍才过
javascript·算法·leetcode
To_OC6 天前
LC 200 岛屿数量:经典 DFS 入门题,我第一次写居然连方向都搞错了
javascript·算法·leetcode
To_OC7 天前
LC 128 最长连续序列:别上来就排序,O (n) 解法才是这题的灵魂
javascript·算法·leetcode
To_OC9 天前
LC 49 字母异位词分组:想到哈希表很简单,选对 key 才是精髓
javascript·算法·leetcode
To_OC10 天前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode
想吃火锅100516 天前
【leetcode】121.买卖股票的最佳时机js/c++
算法·leetcode·职场和发展
凌波粒16 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
嘿黑嘿呦16 天前
chap 8排序
算法·蓝桥杯·排序算法·软件工程