今天做了擺動排序二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...