程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Permutation Sequence -- LeetCode

Permutation Sequence -- LeetCode

編輯:C++入門知識

原題鏈接: http://oj.leetcode.com/problems/permutation-sequence/
這道題目算法上沒有什麼特別的,更像是一道找規律的數學題目。我們知道,n個數的permutation總共有n階乘個,基於這個性質我們可以得到某一位對應的數字是哪一個。思路是這樣的,比如當前長度是n,我們知道每個相同的起始元素對應(n-1)!個permutation,也就是(n-1)!個permutation後會換一個起始元素。因此,只要當前的k進行(n-1)!取余,得到的數字就是當前剩余數組的index,如此就可以得到對應的元素。如此遞推直到數組中沒有元素結束。實現中我們要維護一個數組來記錄當前的元素,每次得到一個元素加入結果數組,然後從剩余數組中移除,因此空間復雜度是O(n)。時間上總共需要n個回合,而每次刪除元素如果是用數組需要O(n),所以總共是O(n^2)。這裡如果不移除元素也需要對元素做標記,所以要判斷第一個還是個線性的操作。代碼如下:

public String getPermutation(int n, int k) {
    if(n<=0)
        return "";
    k--;
    StringBuilder res = new StringBuilder();
    int factorial = 1;
    ArrayList nums = new ArrayList();
    for(int i=2;i=0)
    {
        int index = k/factorial;
        k %= factorial;
        res.append(nums.get(index));
        nums.remove(index);
        if(round>0)
            factorial /= round;
        round--;
    }
    return res.toString();
}
上面代碼還有有個小細節,就是一開始把k--,目的是讓下標從0開始,這樣下標就是從0到n-1,不用考慮n時去取余,更好地跟數組下標匹配。如果有朋友有更好的思路來實現線性的時間復雜度,歡迎指教哈,可以留言或者發郵件到[email protected]給我。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved