[leetcode]46. 全排列

1.题目:
给定一个没有重复数字的序列,返回其所有可能的全排列。

示例:

输入: [1,2,3]
输出:
[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]

2.代码

/**
 * Return an array of arrays of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */
/*
全排列的方法:从开始数(start),与之后的数字依次交换可以得到所有序列(递归)
(1,2)为交换1,2位:
                                      0 1 2
nums:							     [1,2,3]
start=0:			   (0,0)/       (0,1)|     (0,2)\
					   [1,2 3]       [2,1,3]       [3,2,1]   
start=1:		 (1,1)/	(1,2)|	(1,1)/  (1,2)\    (1,1)|    \(1,2)
				[1,2,3]  [1,3,2]  [2,1,3]  [2,3,1]  [3,2,1] [3,1,2]
start=numsSize-1:  |         |       |        |        |       |
				  赋值      赋值     赋值     赋值     赋值     赋值

注意点:每次start 都要跟自己交换一次,这样就可以保证自身也能加到序列中,上面(0,0),(1,1);			
*/
#define MAX 10000

void swap(int i,int j,int *s){
    int temp=s[i];
    s[i]=s[j];
    s[j]=temp;
}

void dfs(int **r,int* nums,int numsSize,int start,int* returnSize){
    if(start==numsSize-1){
        r[*returnSize]=(int *)malloc(sizeof(int )*numsSize);             
        memcpy(r[*returnSize],nums,sizeof(int)*numsSize);      
        (*returnSize)++;    
        return;
    }
    for(int i=start;i

3.知识点:

回溯

你可能感兴趣的:(-------回溯算法)