zoukankan      html  css  js  c++  java
  • 【Leetcode】【Medium】Permutations

    Given a collection of numbers, return all possible permutations.

    For example,
    [1,2,3] have the following permutations:
    [1,2,3][1,3,2][2,1,3][2,3,1][3,1,2], and [3,2,1].

    求队列的"排列"(相似的Leetcode中还有队列"组合"算法:Combination)。典型的使用回溯法。

    回溯法都是求队列的排列组合,可分两种情况:

    1、一种是元素集合成员少,但是每个元素多次出现,则按照一定规律填充队列,例如Generate Parentheses
    2、一种是元素集合成员多,但是每个元素出现一次,则按照不断交换的方法重组队列,复杂度和排列组合计算的过程一样:n*n-1*n-2*...,例如本题;

    对于排列组合题目:

    1、组合的算法,可以按照不断填充的方法;

    2、排列的算法,不能不断填充,因为无序,可以使用交换的方法;

    本题解题思路:

    假设ABCDE的全排列,记为P(ABCDE)

    那么P(ABCDE) = {A P(BCDE)},{B P(ACDE)},{C P(BADE)},{D P(BCAE)},{E P(BCDA)};

    也就是说,ABCDEF的全排列 = A与BCDE的全排列 + B与ACDE的全排列,...

    同理P(BCDE) = {B P(CDE)},{C P(BDE)},{D P(CBE)},{E P(CDB)};

    ....

    最终迭代到最后一层的结果,就是全排列的结果;

    解题步骤:

    1、主函数新建一个二维数组,用于保存全排列结果

    2、调用编写的全排列子函数。

    3、编写一个求全排列的函数,输入为结果保存集合res_lst(引用传值)、数字集合nums(非引用传值,因为每次迭代都不一样)、待排列的数字起始下标idx。

      (1)如果idx = nums.size(),说明已经完成最后一层的全排列,当前nums的排列方式即为一种全排列,将nums装入lst;

      (2)从int i = idx遍历到i = 数组尾:

        a. 交换nums[idx]和nums[i],即把待排列的每个数字置换出去,对剩下的数字递归全排列;

        b. 递归调用求全排列函数,对idx+1及其之后的数字进行全排列;

        c. 还要将nums[idx]和nums[i]交换回来,因为不能影响循环下面的交换操作

    代码:

     1 class Solution {
     2 public:
     3     vector<vector<int>> permute(vector<int>& nums) {
     4         vector<vector<int>> lst;
     5         Backtracking(lst, nums, 0);
     6         return lst;
     7     }
     8     
     9     void Backtracking(vector<vector<int>> &lst, vector<int> nums, int idx) {
    10         if (idx == nums.size() - 1) {
    11             lst.push_back(nums);
    12             return;
    13         }
    14         
    15         for (int i = idx; i < nums.size(); ++i) {
    16             swap(nums[idx], nums[i]);
    17             Backtracking(lst, nums, idx+1);
    18             swap(nums[idx], nums[i]);
    19         }
    20     }
    21 };
  • 相关阅读:
    SpringBoot中如何优雅的使用多线程
    ASP.NET MVC经典项目ProDinner项目解析(5)
    ASP.NET MVC经典项目ProDinner项目解析(4)
    ASP.NET MVC经典项目ProDinner项目解析(1)
    ASP.NET MVC经典项目ProDinner项目解析文章索引
    致我们工作中的设计模式之备忘录模式
    致我们工作中的设计模式之适配器模式
    ASP.NET MVC经典项目ProDinner项目解析(3)
    童话进行中的Silverlight
    致我们工作中的设计模式之基本原则职责单一原则
  • 原文地址:https://www.cnblogs.com/huxiao-tee/p/4336108.html
Copyright © 2011-2022 走看看