【10月打卡~Leetcode每日一题】75. 颜色分类(难度:中等)

    科技2024-12-27  4

    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++在运行速度上有什么区别吗(如果有大神知道可以教我一下!感激不尽!

    Processed: 0.027, SQL: 8