[路飞]_leetcode-75-颜色分类

简介: leetcode-75-颜色分类

网络异常,图片无法展示
|


[题目地址][B站地址]


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


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


示例 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]012


进阶:


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


解题思路


本题要求我们原地对数组进行排序,所有原地排序其实就是在数组内移动元素的位置。

这里我们采用将所有的 0 移动到数组开头,所有的 2 移动到数组末尾的方式。


  1. 获取数组长度 len,初始化 count = 0 记录循环次数,i = 0 记录当前处理元素下标。
  2. 遍历数组,如果当前元素是 0,且不在数组开头,将其移动到数组开头,如果当前元素是 2,将其移动到数组末尾,并且 i--,因为此时后面的元素都向前移动了一位,为了能处理到所有元素,所以需要 i--,如果当前元素是 1,不进行处理。
  3. 当遍历次数 count = len,就处理过了所有元素。


动画演示


网络异常,图片无法展示
|


代码实现


var sortColors = function(nums) {
  // 获取数组长度
  const len = nums.length;
  // 初始化遍历次数 当前元素下标
  let count = 0,i = 0;
  // 遍历输入数组
  while(count<len){
    const num = nums[i]
    // 单过当前元素为 0
    if(num === 0){
      // 将其移动到数组开头
      if(i!==0) nums.unshift(nums.splice(i,1))
    }
    // 如果当前元素为 2,将其移动到数组末尾,因为后面元素统一向前移动了一位,所以 i--
    else if(num === 2) nums.push(nums.splice(i,1)),i--
    // 更新遍历次数和当前元素下标
    count++,i++;
  }
};
复制代码


至此我们就完成了 leetcode-75-颜色分类


如有任何问题或建议,欢迎留言讨论!

相关文章
|
3月前
|
算法 搜索推荐
LeetCode第75题颜色分类
文章介绍了LeetCode第75题"颜色分类"的解法,通过双指针技术对数组中的0、1和2进行排序,避免了传统的排序算法,提供了一种时间复杂度为O(n)的高效解决方案。
LeetCode第75题颜色分类
|
3月前
|
算法 Python
【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
本文介绍了LeetCode 2038题的解法,题目要求在一个由'A'和'B'组成的字符串中,按照特定规则轮流删除颜色片段,判断Alice是否能够获胜,并提供了Python的实现代码。
53 3
|
3月前
|
Python
【Leetcode刷题Python】75. 颜色分类
在不使用sort函数的情况下对包含红色、白色和蓝色元素的数组进行排序的方法:插入排序法和单指针交换法,并提供了相应的Python实现代码。
17 0
|
5月前
|
算法
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
|
5月前
|
算法
【经典LeetCode算法题目专栏分类】【第11期】递归问题:字母大小写全排列、括号生成
【经典LeetCode算法题目专栏分类】【第11期】递归问题:字母大小写全排列、括号生成
|
5月前
|
算法
【经典LeetCode算法题目专栏分类】【第9期】深度优先搜索DFS与并查集:括号生成、岛屿问题、扫雷游戏
【经典LeetCode算法题目专栏分类】【第9期】深度优先搜索DFS与并查集:括号生成、岛屿问题、扫雷游戏
|
5月前
|
算法
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
|
5月前
|
算法
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
【经典LeetCode算法题目专栏分类】【第7期】快慢指针与链表
|
5月前
|
算法
【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值
【经典LeetCode算法题目专栏分类】【第6期】二分查找系列:x的平方根、有效完全平方数、搜索二位矩阵、寻找旋转排序数组最小值
|
5月前
|
算法 机器人
【经典LeetCode算法题目专栏分类】【第5期】贪心算法:分发饼干、跳跃游戏、模拟行走机器人
【经典LeetCode算法题目专栏分类】【第5期】贪心算法:分发饼干、跳跃游戏、模拟行走机器人