@@ -323,5 +323,76 @@ func permuteUnique(_ nums: [Int]) -> [[Int]] {
323323}
324324```
325325
326+ ### C
327+ ``` c
328+ // 临时数组
329+ int *path;
330+ // 返回数组
331+ int **ans;
332+ int *used;
333+ int pathTop, ansTop;
334+
335+ // 拷贝path到ans中
336+ void copyPath () {
337+ int *tempPath = (int*)malloc(sizeof(int) * pathTop);
338+ int i;
339+ for(i = 0; i < pathTop; ++i) {
340+ tempPath[i] = path[i];
341+ }
342+ ans[ansTop++] = tempPath;
343+ }
344+
345+ void backTracking (int* used, int * nums, int numsSize) {
346+ //若path中元素个数等于numsSize,将path拷贝入ans数组中
347+ if(pathTop == numsSize)
348+ copyPath();
349+ int i;
350+ for(i = 0; i < numsSize; i++) {
351+ //若当前元素已被使用
352+ //或前一位元素与当前元素值相同但并未被使用
353+ //则跳过此分支
354+ if(used[ i] || (i != 0 && nums[ i] == nums[ i-1] && used[ i-1] == 0))
355+ continue;
356+
357+ //将当前元素的使用情况设为True
358+ used[i] = 1;
359+ path[pathTop++] = nums[i];
360+ backTracking(used, nums, numsSize);
361+ used[i] = 0;
362+ --pathTop;
363+ }
364+ }
365+
366+ int cmp(void* elem1, void* elem2) {
367+ return * ((int* )elem1) - * ((int* )elem2);
368+ }
369+
370+ int** permuteUnique(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
371+ //排序数组
372+ qsort(nums, numsSize, sizeof(int), cmp);
373+ //初始化辅助变量
374+ pathTop = ansTop = 0;
375+ path = (int* )malloc(sizeof(int) * numsSize);
376+ ans = (int** )malloc(sizeof(int* ) * 1000);
377+ //初始化used辅助数组
378+ used = (int* )malloc(sizeof(int) * numsSize);
379+ int i;
380+ for(i = 0; i < numsSize; i++) {
381+ used[ i] = 0;
382+ }
383+
384+ backTracking(used, nums, numsSize);
385+
386+ //设置返回的数组的长度
387+ *returnSize = ansTop;
388+ *returnColumnSizes = (int*)malloc(sizeof(int) * ansTop);
389+ int z;
390+ for(z = 0; z < ansTop; z++) {
391+ (*returnColumnSizes)[z] = numsSize;
392+ }
393+ return ans;
394+ }
395+ ```
396+
326397-----------------------
327398<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>
0 commit comments