LeetCode #46 Permutations

题目:

https://leetcode.com/problems/permutations/description/

Given a collection of distinct integers, return all possible permutations.

Difficulty: Medium

Example:

Input: [1,2,3]
Output:
[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]

即是求给出的一组不同整数的所有不同排列。


分析:

以[1 2 3]为例,我们手算时一般会这么做:

1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

但是本人认为按这个有序的步骤来编写程序,需要额外的标记来指明每次需要取哪个数字放到某一位上,比较麻烦。

经过观察,有如下规律:(第几位指从左到右的第几个数字)

排列的生成规律

总的来说,就是要不断进行不同的数位交换。每次交换后产生的新排列们也参与之后的交换。

所以,有以下算法:

class Solution {
public:
    vector<vector<int>> permute(vector<int>& nums) {
    	vector<vector<int>> result;
    	result.push_back(nums);
        int size = nums.size();
        for(int i = size - 2; i >= 0; i--){
        	int ss = result.size();
        	for(int k = 0; k < ss; k++){	// 先前的结果集合中的每个排列都要参与接下来的交换
        		for(int j = size - 1; j > i; j--){
	        		vector<int> nn = result[k];
	        		int tmp = nn[j];	// 交换第i位和第j位
	        		nn[j] = nn[i];
					nn[i] = tmp;
					result.push_back(nn);
				}
			}
	        	
		}
		return result;
    }
};

时间复杂度为 O ( n ! ) O(n!) O(n!),其中n为给出的数字个数。
用时为8ms。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值