realme Pad 通過萊茵認證,電池容量 7100mAh
阿新 • • 發佈:2021-07-13
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);