wiggle sort和顏色分類

2021-09-26 03:16:11 字數 2287 閱讀 2960

今天做了擺動排序二324。題目要求:

給定乙個無序的陣列nums,將它重新排列成nums[0] < nums[1] > nums[2] < nums[3]...的順序。

void wigglesort(vector& nums) 

}

看完後,一臉懵逼,a巨集函式是幹嘛??為啥這麼操作。經過不斷搜資料,才發現一點思路。

首先這個解法是這樣的:

1)利用快排的partition找到中位數,時間複雜度o(n)

2)把小於中位數和大於中位數的交錯排列,就得到正確的結果。

第一步容易實現,關鍵是第二步,這個操作是怎麼回事?回想leetcode75題,顏色排序問題。也就是給定乙個只含有0,1,2的陣列,排序這個陣列。回顧當時的解答:

void sortcolors(vector& nums) 

}

是不是一模一樣?也就是利用三個指標,把數字分成有序的三份的演算法。再回到324wiggle sort,模擬到這裡的問題,其實也就是三個數字分別對應「小於median」,等於"median",大於"median"。

再觀察a函式巨集。

n|1做的操作是取大於等於n的最小的奇數,也就是對於奇數n,a(i) = (2i+1) % n,對於偶數n,a(i) = (2i+1) % (n+1),不難驗證,其實它做的對映是:

accessinga(0)actually accessesnums[1].

accessinga(1)actually accessesnums[3].

accessinga(2)actually accessesnums[5].

accessinga(3)actually accessesnums[7].

accessinga(4)actually accessesnums[9].

accessinga(5)actually accessesnums[0].

accessinga(6)actually accessesnums[2].

accessinga(7)actually accessesnums[4].

accessinga(8)actually accessesnums[6].

accessinga(9)actually accessesnums[8].

也就是通過下標,分別索引奇數字和偶數字。

和顏色分類那題不同,我們想要的不是排序,而是偶數字放小於median的數,奇數字放大於median的數,median都被放在了最後一位奇數字或者第一位偶數字。(為什麼?因為median總是存在,最後從j++,j碰到k跳出迴圈)這個性質非常重要,這樣就避免了4 5 5 6這種情況,把中位數放到最後或者第一位,就不會使得中間有相等的情況。

這個座標對映非常巧妙,座標對映通常非常有用,想起之前看到的那道題:一共100張牌,分別寫著1,2,3...100,牌頂拿一張放在桌子上,再拿一張放在堆底,重複如此操作,知道手裡沒有牌,發現桌子上正好按照順序1-100放著,問原來牌堆的順序。

解法:取1-100順序的牌堆,按照如上規則,再發一次牌,得到的桌面上的順序,每個牌面的值個座標值交換,得到原來牌堆的順序。

或者另一道:

對於1,2,3,...n,已經知道第q個全排列a1,..an,問倒數第q個全排列。

方法也是類似,

第q個全排列,相當於1 2 3 4...n經過變換程式設計a1 a2 a3... an

那麼倒數第q個全排列,設為x1...xn,那麼經過變換,可以得到x_a1, x_a2...x_an

也就是x_a1=n, x_a2=n-1....x_an=1,從而得到解。

記錄一下自己的leetcode 324實現:

class solution 

swap(nums[r], nums[++i]);

if(i == k) else if(i < k) else

}void wigglesort(vector& nums) else if(nums[oj] > mid) else }}

};

LintCode 顏色分類

題目 給定乙個包含紅,白,藍且長度為 n 的陣列,將陣列元素進行分類使相同顏色的元素相鄰,並按照紅 白 藍的順序進行排序。我們可以使用整數 0,1 和 2 分別代表紅,白,藍。挑戰 乙個相當直接的解決方案是使用計數排序掃瞄2遍的演算法。首先,迭代陣列計算 0,1,2 出現的次數,然後依次用 0,1,...

75 顏色分類

給定乙個包含紅色 白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色 白色 藍色順序排列。此題中,我們使用整數 0 1 和 2 分別表示紅色 白色和藍色。注意 不能使用 庫中的排序函式來解決這道題。示例 輸入 2,0,2,1,1,0 輸出 0,0,1,1,2,...

leetcode 顏色分類

75顏色分類 給定乙個包含紅色 白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色 白色 藍色順序排列。此題中,我們使用整數 0 1 和 2 分別表示紅色 白色和藍色。注意 不能使用 庫中的排序函式來解決這道題。示例 輸入 2,0,2,1,1,0 輸出 0,0...