1. 題目
2. 思路和題解
這道題是很經典的荷蘭國旗問題,根據題目意思,要對這個數組按照顏色排序,而此時現在的紅、白、藍三個顏色分別對應0,1,2,因此可以想到使用冒泡排序對該數組進行排序。
代碼如下:
class Solution {public void sortColors(int[] nums) {for (int i = 0; i < nums.length; i++) {for (int j = nums.length - 1; j > i; j--) {if (nums[j - 1] > nums[j]) {int temp = nums[j];nums[j] = nums[j - 1];nums[j - 1] = temp;}}}}
}
雖然這種方法可以通過,但是時間復雜度很高,然后查看了官方給出的題解,官方是先統計數組中0,1,2的個數,然后根據他們的數量,重寫整個數組。初始化兩個指針分別指向0和nums.length - 1,然后如果遇到0,就交換到數組的頭部,遇到2,就交換到數組的尾部,當遍歷的數組超過了右指針,則遍歷結束。這一需要注意的一點是,當找到2時,需要不斷地將其進行交換,直到新的nums[i]不為2,才能停止交換。
代碼如下:
class Solution {public void sortColors(int[] nums) {int left = 0, right = nums.length - 1;for (int i = 0; i <= right; ++i) {while (i <= right && nums[i] == 2) {int temp = nums[i];nums[i] = nums[right];nums[right] = temp;--right;}if (nums[i] == 0) {int temp = nums[i];nums[i] = nums[left];nums[left] = temp;++left;}}}
}
用這種方法,時間復雜度就低很多了,也能更適用于普遍的情況。