75. 颜色分类
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
其实题目大意就是:给你一个数组Nums,内含0 ,1 ,2(可能不全含),让升序排序【要注意是在原数组操作,不另开空间】。
今天上午买衣服,下午4点多到宿舍,吃完饭收拾了行李倒垃圾,8点半才来实验室,做题也感觉脑子有点不清醒,不是debug,完全是在试错。
有点不太想动脑子,写完题解今天早点回去睡觉了。
正常做法:双遍历,首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组。
优化做法:在一次遍历中统计0 ,1, 2的个数,将对应位置进行调换即可
class Solution:
def sortColors(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
index0,index1,index2 = -1,-1,-1
len_ = len(nums)
for i in range(len_):
if nums[i] == 0:
index0 += 1
index1 += 1
if index0 == index1 or index1 == i:
nums[index0],nums[i] = nums[i],nums[index0]
else:
nums[index0],nums[index1],nums[i] = nums[i],nums[index0],nums[index1]
elif nums[i] == 1:
index1 += 1
nums[i],nums[index1] = nums[index1],nums[i]
题目不是特别难,但是有点小坑( 做题必须动脑子,考虑到各种情况,今天我确实状态不太对,往前提交通过率65%左右,今天才16%,把所有情况列完(①如果数组中没有1,2②如果数组中没有2),即可避免我今天所犯的很蠢的错误。
一遍遍历,所以时间复杂度O(n),因为是在原数组进行操作,所以空间复杂度O(1)
C++
class Solution {
public:
void sortColors(vector<int>& nums) {
int index0 = -1, index1 = -1,index2 = -1;
int len_ = nums.size();
int temp;
for(int i=0;i<len_;i++)
{ if (nums[i] == 0)
{ index0 ++,index1 ++;
if (index0 == index1 || index1 == i)
{ temp = nums[index0];
nums[index0] = nums[i];
nums[i] = temp;
}
else
{ temp = nums[index0];
nums[index0] = nums[i];
nums[i] = nums[index1];
nums[index1] = temp;
}
}
else if (nums[i] == 1)
{ index1 ++;
temp = nums[i];
nums[i] = nums[index1];
nums[index1] = temp;
}
}
}
};
PS①:两个数组位置交换可以用swap,这样代码看起来会干净很多
PS②:++i和i++在运行速度上有什么区别吗(如果有大神知道可以教我一下!感激不尽!