Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Update 荷兰国旗.md
add C++ Code
  • Loading branch information
liyupi authored Apr 26, 2021
commit f51ee922d0b09271be66f944ed813486522e66b3
68 changes: 68 additions & 0 deletions animation-simulation/数据结构和算法/荷兰国旗.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@

下面我们直接看代码吧,和三向切分基本一致。

Java Code:

```java
class Solution {
public void sortColors(int[] nums) {
Expand Down Expand Up @@ -99,6 +101,37 @@ class Solution {
}
```

C++ Code:

```c++
class Solution {
public:
void sortColors(vector<int>& nums) {
int len = nums.size();
int left = 0;
//这里和三向切分不完全一致
int i = left;
int right = len-1;

while (i <= right) {
if (nums[i] == 2) {
swap(nums,i,right--);
} else if (nums[i] == 0) {
swap(nums,i++,left++);
} else {
i++;
}
}
}

void swap (vector<int>& nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
};
```

另外我们看这段代码,有什么问题呢?那就是我们即使完全符合时,仍会交换元素,这样会大大降低我们的效率。

例如:[0,0,0,1,1,1,2,2,2]
Expand All @@ -117,6 +150,8 @@ class Solution {

另一种代码表示

Java Code:

```java
class Solution {
public void sortColors(int[] nums) {
Expand Down Expand Up @@ -148,5 +183,38 @@ class Solution {
}
```

C++ Code:

```c++
class Solution {
public:
void sortColors(vector<int>& nums) {
int left = 0;
int len = nums.size();
int right = len - 1;
for (int i = 0; i <= right; ++i) {
if (nums[i] == 0) {
swap(nums,i,left);
left++;
}
if (nums[i] == 2) {
swap(nums,i,right);
right--;
//如果不等于 1 则需要继续判断,所以不移动 i 指针,i--
if (nums[i] != 1) {
i--;
}
}
}

}
void swap (vector<int>& nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
};
```

好啦,这个问题到这就结束啦,是不是很简单啊,我们明天见!