给定一个包含红色、白色和蓝色、共 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]
var sortColors = function(nums) {
function jiaohuan(a, b){
const temp = nums[a];
nums[a] = nums[b];
nums[b] = temp;
};
let m = 0;
let i = 0;
let n = nums.length-1;
while(i<=n){
if(nums[i] === 0){
jiaohuan(i,m);
m++;
i++;
}
else if(nums[i] === 1){
i++;
}
else if(nums[i] === 2){
jiaohuan(n,i);
n--;
}
}
return ;
};
解题思路
分析:本题中要求不可以使用库函数,而且是原地对它们进行排序,所以说不可以新开数组空间,只能在原数组中进行数字交换。
1.建立一个简单的交换函数,用来交换数组中的两个数
2.定义三个变量,分别记录数组的头的变量m,记录数组的尾的变量n和一个用来记录是否将数组全部遍历完的变量i
3.一个while循环(循环条件要为i<=n),里面if-else判断。当i位置的值是0时,交换nums[m]和nums[i],m++, i++;当i位置的值是1时,i++;当i位置的值是2时,交换nums[i]he nums[n],n--。
注意:while循环体里的判断要用if-else,千万不要使用三个if判断,因为那样三个if都会走进去,会出错的。
while(i<=n){
if(nums[i] === 0){
jiaohuan(i,m);
m++;
i++;
}
else if(nums[i] === 1){
i++;
}
else if(nums[i] === 2){
jiaohuan(n,i);
n--;
}
}