Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
颜色分类
原题地址
给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
必须在不使用库的sort函数的情况下解决这个问题。
示例 1:
输入:nums = [2,0,2,1,1,0]
输出:[0,0,1,1,2,2]
示例 2:
输入:nums = [2,0,1]
输出:[0,1,2]
提示:
n == nums.length1 <= n <= 300nums[i]为 0、1 或 2
思路分析
方法一
分析题目可以得知,按照颜色分类实际是将数组升序排列,那么可以使用双重循环,来将数组升序排列即可。
方法二
- 遍历数组,将红白蓝分别含有多少个统计出来。
- 循环数组,将对应红白蓝个数的数组位置赋对应的红白蓝的数值即可。
AC 代码
方法一
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var sortColors = function(nums) {
for(let i=0;i<nums.length;i++) {
for(let j=i+1;j<nums.length;j++) {
if(nums[i] >= nums[j]) {
[nums[i], nums[j]] = [nums[j], nums[i]]
}
}
}
};
结果:
- 执行结果: 通过
- 执行用时:68 ms, 在所有 JavaScript 提交中击败了51.51%的用户
- 内存消耗:41.5 MB, 在所有 JavaScript 提交中击败了9.36%的用户
- 通过测试用例:87 / 87
方法二
/**
* @param {number[]} nums
* @return {void} Do not return anything, modify nums in-place instead.
*/
var sortColors = function(nums) {
let red = 0
let white = 0
let blue = 0
for(let i = 0; i < nums.length; i++) {
if(nums[i] === 0) red++
if(nums[i] === 1) white++
if(nums[i] === 2) blue++
}
for(let i = 0; i < nums.length; i++) {
if(i < red) nums[i] = 0
else if(i >= red && i < red + white) nums[i] = 1
else nums[i] = 2
}
};
结果:
- 执行结果: 通过
- 执行用时:68 ms, 在所有 JavaScript 提交中击败了51.51%的用户
- 内存消耗:41 MB, 在所有 JavaScript 提交中击败了47.56%的用户
- 通过测试用例:87 / 87