力扣 题目75- 颜色分类
题目
题解
1.移动法(推荐)
在该方法中我们只需要记录一下白色开头值即可 如果为0则移动到开头 如果为1则移动到白色开头值 2会被推到最后
例
2,0,2,1,1,0->0,2,2,1,1,0->0,1,2,2,1,0->0,1,1,2,2,0->0,0,1,1,2,2
2.交换法
需要记录 白色的开头与蓝色的开头
当为0时 白色的开头需要与蓝色的开头交换 然后i再与白色的开头交换 如果i这里蓝色的开头则直接交换
当为1时 白色的开头与i交换
例
2,0,2,1,1,0->0,2,2,1,1,0->0,1,2,2,1,0->0,1,1,2,2,0->0,0,1,,12,2
代码
1.
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 class Solution { 5 public: 6 void sortColors(vector<int>& nums) { 7 int white=0; 8 for (int i = 0; i < nums.size(); i++) { 9 if (nums[i] == 0) { 10 nums.insert(nums.begin(), 1,nums[i]); 11 nums.erase(nums.begin() + i+1); 12 white += 1; 13 } 14 else if(nums[i] == 1) 15 { 16 nums.insert(nums.begin()+ white,1, nums[i]); 17 nums.erase(nums.begin() + i + 1); 18 } 19 } 20 } 21 }; 22 23 int main() { 24 Solution sol; 25 vector<int> nums = { 0 }; 26 sol.sortColors(nums); 27 for (int i = 0; i < nums.size(); i++) { 28 cout << nums[i] << endl; 29 } 30 }
2.
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 class Solution { 5 public: 6 void sortColors(vector<int>& nums) { 7 int red = 0; 8 int white = 0; 9 for (int i = 0; i < nums.size(); i++) { 10 if (nums[i] == 0) { 11 if (i != white) { 12 swap(nums[red], nums[white]); 13 } 14 swap(nums[red], nums[i]); 15 red += 1; 16 white += 1; 17 } 18 else if (nums[i] == 1) 19 { 20 swap(nums[white], nums[i]); 21 white += 1; 22 } 23 } 24 } 25 }; 26 27 int main() { 28 Solution sol; 29 vector<int> nums = { 0 }; 30 sol.sortColors(nums); 31 for (int i = 0; i < nums.size(); i++) { 32 cout << nums[i] << endl; 33 } 34 }