字節尿性,康託展開求第K個排列!

2021-03-01 小浩算法

從數學方法說起,先講一下康託展開。

那康託展開是幹嘛的?用來計算當前排列在所有由小到大全排列中的順序。臥槽,不就是本題嗎。

聽不懂?就是說如果你知道 1234 是序號 1,1243 是 序號2,這個公式就可以直接告訴你 4132 的序號是多少!

公式是這樣的:

解釋一哈:

這個 X 就是最終的序號值,比實際序號少一位,因為可以看到康託展開第一位計算的值是 0 。

網上看到的很多圖可能名次是從 1 開始,這個大家注意一下就行:

關鍵是這個  ,這個其實就是看原數的第 i 位在當前未出現的元素中是排在第幾個

感覺這句話有點拗口,用上面出現的問題解釋一下:1234 是序號 1,1243 是 序號 2, 4132 的序號是多少?

解釋:第一個數是 4,比 4 小的並且還沒有出現過的數有 3 個(123),第二個數是 1,比 1 小的並且還沒有出現過的數為 0 個。第三個數是 3,比 3 小的並且還沒有出現過的數為 1。第四個數是 2 ,比 2 小的並且還沒有出現過的數為 0 個。

有 X = 3*3!+ 0*2!+ 1*1!+ 0*0!= 19,此時的序號為 19+1 = 20。還不明白的看下下面這個圖:

然後我們把上面的東西反著來,就叫做 逆康託展開。換句話說,就是給我們了 X 的值,讓我們求  。

對於 逆康託展開,我還是給一個例子。比如 nums 還是 1234,我們要找第 15 位。那麼要進行以下幾步:

首先,因為 X 比實際序號少一位,所以我們要用實際序號減1,也就是 15 - 1 = 14。

目標值的第一個字符,14 / 3! = 2 ... 2 (商2餘2),沒有已使用的字符,第一個字符取在未使用的字符中排增序第3。即3

目標值的第二個字符,2 / 2! = 1 ... 0,已使用的字符為3,第二個字符取在未使用的字符中增序排第2。即2

目標值的第三個字符,0 / 1! = 0 ... 0,已使用的字符為2和3,第三個字符取在未使用的字符中增序排第1。即1

目標值的第三個字符,0 / 0! = 0 ... 0,已使用的字符為1,2和3,第四個字符取在未使用的字符中增序排第1。即4

那麼要求的這個序列為:3214。

可以查下上面的表,發現是正確的。如果看不懂,可以回到上面的例子再看看,其實就是把上面過程倒著來。

最後,我們再將逆康託展開進行應用:

//JAVA
class Solution {
    public String getPermutation(int n, int k) {
        StringBuilder sb = new StringBuilder();
        // 候選數字
        List<Integer> candidates = new ArrayList<>();
        // 分母的階乘數
        int[] factorials = new int[n+1];
        factorials[0] = 1;
        int fact = 1;
        for(int i = 1; i <= n; ++i) {
            candidates.add(i);
            fact *= i;
            factorials[i] = fact;
        }
        //預處理
        k -= 1;
        for(int i = n-1; i >= 0; --i) {
            // 計算候選數字的index
            int index = k / factorials[i];
            sb.append(candidates.remove(index));
            k -= index*factorials[i];
        }
        return sb.toString();
    }
}

相關焦點

  • 【數學|算法】康託展開(Cantor expansion)及逆康託展開
    康託展開(Cantor expansion)及逆康託展開康託展開康託展開的定義康託展開是一個全排列到一個自然數的雙射,常用於構建哈希表時的空間壓縮
  • Excel第k個最大值函數LARGE和第k個最小值函數SMALL
    今天我們來介紹Excel第k個最大值函數LARGE和第k個最小值函數SMALL。1.第k個最大值函數LARGE函數格式為=LARGE(數組,K)【數組】為需要從中選擇第 k 個最大值的數組或數據區域。【K】為需要返回的第幾個最大值(從大到小)。
  • 集合論創始人康託
    康託創立了驚世駭俗的超窮數理論掀起起了數學與哲學史上一場深刻的革命。          對於康託來說無窮是實在的,他們可以不同,可以比較大小,可以進行數學運算,甚至可以對其進行超窮歸納等等。          無窮,可以比較大小,比如說,有理數,有無窮多個,整數也有無窮多個,這兩個無窮多是相等的。
  • 一文學會排列組合
    什麼是排列排列的定義:從n個不同元素中,任取 m (m≤n,m與n均為自然數,下同)個不同的元素按照一定的順序排成一列,叫做從n個不同元素中取出m個元素的一個排列;從n個不同元素中取出m(m≤n)個元素的所有排列的個數
  • gre數學部分排列組合概念和基本公式
    gre數學部分排列組合的內容也是經常會考到的,考生如果想拿到這類題型的分數,必須要先掌握gre數學部分排列組合概念和基本公式。下面我們就給大家簡單地介紹一下相關知識。  排列(permutation)組合(combination)  (一)概念  1.排列與組合的區別:  將一個事件內的元素的順序調換,如果這個事件不變,那麼是組合問題;如果這個事件改變,那麼是排列問題。  排列問題要考慮位置關係,組合問題不需要考慮位置關係。
  • 求老虎尿做藥引風傳治風溼
    求老虎尿做藥引風傳治風溼 青島晚報電子報   2012.12.11 星期二     「老虎尿做藥引,能治風溼?」市民李先生日前致電報社諮詢說,他的朋友在武漢動物園接老虎尿用來治病,不知是否有效。記者從武漢動物園了解到,確實有人求飼養員幫忙弄老虎尿做藥引。
  • 部分等於整體,說無窮,道無窮,無窮世界的封印,康託的悲鳴
    比如教室有50個座位,老師走進教室,一看坐滿了人,不需點數,便可知道聽課人數是50。倘若空了幾個座位,立刻會知道,聽課學生少於50,這是因為「部分小於整體」的緣故。然而,這是有限情況下的規律,對於無限情況,就像前面伽利略例子一樣,部分可能等於整體!這,正是無限的本質!
  • java中的字節進位計算和(&)位運算符
    1、什麼是字節?字節就是計算機最小的單位!2、字節和二進位有什麼關係?
  • 談用泰勒展開法求極限
    作為求極限的最強殺器,泰勒展開以它簡單粗暴的運算方法,深受工科數學出題老師的喜愛。
  • java算法之尋找最小的k個數
    如下述文字:選取S中一個元素作為樞紐元v,將集合S-{v}分割成S1和S2,就像快速排序那樣如果k <= |S1|,那麼第k個最小元素必然在S1中。在這種情況下,返回QuickSelect(S1, k)。如果k = 1 + |S1|,那麼樞紐元素就是第k個最小元素,即找到,直接返回它。
  • 100 個最偉大的數學定理,你知多少?
    這一千年似乎刺激了許多人去編輯許多東西的「最重要的 100 個」或是「最好的 100 個」的列表,包括電影(由美國電影學會)和書(由現代圖書館)。數學家並沒有免疫這些影響,在 1999 年 7 月的一個數學會議中,Paul 和 Jack Abad 提出了他們的「一百個最偉大的定理」名單。
  • 排列組合公式/排列組合計算公式
    公式P是指排列,從N個元素取R個進行排列。公式C是指組合,從N個元素取R個,不進行排列。
  • 上海腎臟周 | 生理性蛋白尿只是「過客」,病理性則需及時就診
    上海腎臟周 | 生理性蛋白尿只是「過客」,病理性則需及時就診 2020-03-30 17:22 來源:澎湃新聞·澎湃號·湃客
  • 每天解決一個小問題之排列組合
    引言:(1)高考中對兩個計數原理、排列、組合的考查以基本概念、基本方法(如「在」「不在」問題、相鄰問題、相間問題)為主,主要涉及數字問題、樣品問題、幾何問題、塗色問題、選取問題等;對二項式定理的考查,主要是利用通項求展開式的特定項,利用二項式定理展開式的性質求有關係數問題.主要考查分類與整合思想、轉化與化歸思想、補集思想和邏輯思維能力.
  • 高二數學二項展開式習題證明詳解
    01尖子生數理化教育天天答疑篇之二項展開式相關的證明詳解本次課程內容:根據學生提出的疑問,將二項展開式證明題目進行詳解,並將相關的考點進行匯總,最後留相關的基礎習題供學生們進行練習。2 恆等式證明技巧之左右展開看是否相等的思想3 排列組合中的C(n,m)和C(n,n-m)之間的恆等關係如果你能夠熟練應用上面的三個考點,並且將其結合起來就能給出這個題目最後的完美證明結果。
  • 打怪、升級、然後重新來過:陷入無限loop的字節跳動
    從商業模式上講,小型手遊公司的運營模式最接近loop:不斷推出新遊戲,賺個首充之後又不斷被用戶遺忘。就像我們可能記得風靡一時的手遊《刀塔傳奇》,也知道《劍與家園》,但很少有人知道他們來自同一家遊戲開發工作室。但有趣的是,除了遊戲產業外,在內容產業做得風生水起的字節跳動,現在也越來越接近這種「loop模式」了。舊王已死,新王何以永存?
  • 武漢動物園收老虎尿保存 專家稱虎尿藥用不可信
    中新網9月29日電 據長江商報報導,近日,從湖北武漢動物園獲悉,許多人託關係、走後門,來動物園討要老虎尿。動物園管理處總工程師杜有順說,前來取尿的人認為虎尿可以治療風溼、類風溼等疾病。飼養員說,一隻老虎一晚上可以排出1500毫升尿液,「有段時間,我每天早上要帶一個大可樂瓶子或3個礦泉水瓶子才夠裝。」動物園一位工作人員稱,只要養虎的地方,都會有人收集虎尿。「為收集虎尿,還有人想給老虎帶上一個特大號的安全套呢。」  該園總工程師杜有順說,1985年以後,就不斷有人來動物園取虎尿。他說,老鄉們知道他在動物園工作後,多次囑託帶點虎尿出來。「有時回去一趟得帶上一二十斤」。
  • 對消除蛋白尿和血尿有效
    苞葉少數,較上部葉稍短,長圓形或條形,兩面或下面被白色或灰白色厚茸毛,在雄株多少開展成苞葉群,在雌株多少直立,不排列成明顯的苞葉群。頭狀花序大,雌株的直徑7-10mm,3-7個密集,稀1個或較多,在雌株常有較長的花序梗排列成傘房狀;總苞半球形,長4-6mm,被白色綿毛;總苞片約4層,常狹尖,稍露出毛茸之上;小花雌雄異株,稀同株;雄花花冠長約3.5mm,狹漏鬥狀,有小裂片;雌花花冠絲狀,花後生長,長4.5-5mm;冠毛白色,長約4mm;雄花冠毛有鋸齒或毛狀齒;雌花冠毛有微齒;一育的子房無毛工有乳頭狀突起