1. 程式人生 > 資訊 >realme Pad 通過萊茵認證,電池容量 7100mAh

realme Pad 通過萊茵認證,電池容量 7100mAh

75. 顏色分類

知識點:陣列;雙指標;

題目描述

找出陣列中重複的數字。

給定一個包含紅色、白色和藍色,一共n個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。

此題中,我們使用整數 0、1 和 2 分別表示紅色、白色和藍色。

示例
輸入:nums = [2,0,2,1,1,0]
輸出:[0,0,1,1,2,2]

輸入:nums = [2,0,1]
輸出:[0,1,2]

輸入:nums = [0]
輸出:[0]

輸入:nums = [1]
輸出:[1]


解法一:排序法

此題就是讓從小到大排序,可以直接使用氣泡排序,

class Solution {
    public void sortColors(int[] nums) {
        for(int i = 0; i < nums.length; i++){
            for(int j = 0; j < nums.length-1-i; j++){
                if(nums[j] > nums[j+1]){
                    int temp = nums[j];
                    nums[j] = nums[j+1];
                    nums[j+1] = temp;
                }
            }
        }
    }
}

時間複雜度:O(N^N);

解法二:單指標

使用一個指標,遍歷兩次,先把0排好,再把1排好就行了;

class Solution {
    public void sortColors(int[] nums) {
        int head = 0;   //Z指示排好的序列的下一個元素即要排的序列;
        for(int i = 0; i < nums.length; i++){ //找0的過程;找到了和head的元素交換;
            if(nums[i] == 0){    
                nums[i] = nums[head];
                nums[head] = 0;
                head++;
            }
        }
        for(int i = head; i < nums.length; i++){
            if(nums[i] == 1){
                nums[i] = nums[head];
                nums[head] = 1;
                head++;
            }
        }
    }
}

時間複雜度:O(N)+O(N);

解法三:雙指標

首尾各定義一個指標;首指標排0,尾指標排2,這樣遍歷一遍就可以了;
注意在首指標前面所有的0都歸位,在尾指標後面所有的2葉歸位;

class Solution {
    public void sortColors(int[] nums) {
        int head = 0, tail = nums.length-1;
        int i = 0;
        while(i <= tail){  //到尾指標就可以了,尾指標後面都已經搞定了;
            if(i < head) i = head;   //可能出現情況left直接超過i了,i前面都搞定了,所以可以讓其從head開始;
            else if(nums[i] == 0){
                swap(nums, i, head);
                head++;
            }else if(nums[i] == 2){
                swap(nums, i, tail);
                tail--;
            }else{
                i++;
            }
        }
    }
    private void swap(int[] nums, int i, int j){
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}

時間複雜度:O(N);