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

75. 颜色分类

作者头像
lucifer210
发布2019-10-28 15:04:43
3640
发布2019-10-28 15:04:43
举报
文章被收录于专栏:脑洞前端

题目描述

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

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

注意:

不能使用代码库中的排序函数来解决这道题。

示例:

输入: [2,0,2,1,1,0]

输出: [0,0,1,1,2,2]

进阶:

一个直观的解决方案是使用计数排序的两趟扫描算法。

首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。

你能想出一个仅使用常数空间的一趟扫描算法吗?

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/sort-colors

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

其实就是排序,而且没有要求稳定性,就是用啥排序算法都行。题目并没有给出数据规模,因此我默认数据量不大,直接选择了冒泡排序

关键点解析

冒泡排序的时间复杂度是N平方,无法优化,但是可以进一步优化常数项, 比如循环的起止条件。由于每一次遍历都会将最后一位“就位”,因此内层循环的截止条件就可以是 nums.length-i, 而不是 nums.length, 可以省一半的时间。

代码

代码语言:javascript
复制
/*
 * @lc app=leetcode id=75 lang=javascript
 *
 * [75] Sort Colors
 *
 * https://leetcode.com/problems/sort-colors/description/
 *
 * algorithms
 * Medium (41.41%)
 * Total Accepted:    297K
 * Total Submissions: 716.1K
 * Testcase Example:  '[2,0,2,1,1,0]'
 *
 * 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?
 *
 *
 */
/**
 * @param {number[]} nums
 * @return {void} Do not return anything, modify nums in-place instead.
 */
var sortColors = function(nums) {
function swap(nums, i, j) {
const temp = nums[i];
       nums[i] = nums[j];
       nums[j] = temp;
}
for(let i = 0; i < nums.length - 1; i++) {
for(let j = 0; j < nums.length - i; j++) {
if(nums[j] < nums[j -1]) {
                swap(nums, j - 1, j)
}

}
}
};
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 脑洞前端 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • 思路
  • 关键点解析
  • 代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档