LeetCodeDay52 —— 全排列★★★

46. 全排列 Permutations

描述
  • Given a collection of distinct integers, return all possible permutations.
示例
  Input: [1,2,3]
  Output:
  [
    [1,2,3],
    [1,3,2],
    [2,1,3],
    [2,3,1],
    [3,1,2],
    [3,2,1]
  ]
思路:
  1. 遞歸全排列就是從第一個數(shù)字起每個數(shù)分別與它后面的數(shù)字交換。
  2. 去重的全排列就是從第一個數(shù)字起每個數(shù)分別與它后面非重復(fù)出現(xiàn)的數(shù)字交換。(交換的時候判斷下是否已出現(xiàn)即可)
  3. 非遞歸全排列就是由后向前找替換數(shù)和替換點,然后由后向前找第一個比替換數(shù)大的數(shù)與替換數(shù)交換,最后顛倒替換點后的所有數(shù)據(jù)。(證明)
    (參考)
// 遞歸版本
class Solution_46_01 {
 public:
  vector<vector<int>> permute(vector<int>& nums) {
    if (nums.empty()) return {};
    vector<vector<int>> ret;
    _permute(0, nums.size() - 1, nums, ret);
    return ret;
  }
  void _permute(int k, int size, vector<int>& nums, vector<vector<int>>& ret) {
    if (k == size) {
      ret.push_back(nums);
      return;
    }
    for (int i = k; i <= size; ++i) {
      swapNum(nums, k, i);
      _permute(k + 1, size, nums, ret);
      swapNum(nums, i, k);
    }
  }
  void swapNum(vector<int>& nums, int left, int right) {
    int tmp = nums[left];
    nums[left] = nums[right];
    nums[right] = tmp;
  }
};

// 非遞歸版本,基于Stl的next_permutation
class Solution_46_02 {
 public:
  vector<vector<int>> permute(vector<int>& nums) {
    if (nums.empty()) return {};
    vector<vector<int>> ret;
    std::sort(nums.begin(), nums.end());
    ret.push_back(nums);
    while (next_permutation<vector<int>::iterator>(nums.begin(), nums.end())) {
      ret.push_back(nums);
    }
    return ret;
  }
  template <class BidirIt>
  bool next_permutation(BidirIt first, BidirIt last) {
    if (first == last) return false;
    BidirIt i = last;
    if (first == --i) return false;
    while (true) {
      BidirIt i1, i2;
      i1 = i;
      if (*--i < *i1) {
        i2 = last;
        while (!(*i < *--i2))
          ;
        std::iter_swap(i, i2);
        std::reverse(i1, last);
        return true;
      }
      if (i == first) {
        std::reverse(first, last);
        return false;
      }
    }
  }
};
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • LeetCode 刷題隨手記 - 第一部分 前 256 題(非會員),僅算法題,的吐槽 https://leetc...
    蕾娜漢默閱讀 18,370評論 2 36
  • 本文內(nèi)容為練習(xí)LeetCode題目時的解題思路和不同算法的記錄,實現(xiàn)語言為C++,代碼保存在Github,均已在L...
    SK木眠閱讀 1,112評論 0 0
  • 我希望有個如你一般的人。如這山間清晨一般明亮清爽的人,如奔赴古城道路上陽光一般的人,溫暖而不炙熱,覆蓋我所有肌膚。...
    Mr紹君閱讀 557評論 2 4
  • 幼時便邂逅《紅樓》,雖懵懂,仍為那座“天上人間諸景備”的大觀園心動不已;及至年歲漸長,方領(lǐng)略《紅樓》之美。以我淺薄...
    淺蘸煙蕪閱讀 405評論 0 2
  • 月初女兒不上學(xué),我剛開始心慌,害怕,當(dāng)我有意識把自己抽離開后,我發(fā)現(xiàn)我竟能夠這樣的安穩(wěn),不在心慌和恐...
    紅紅456閱讀 289評論 4 3

友情鏈接更多精彩內(nèi)容