@@ -323,5 +323,76 @@ func permuteUnique(_ nums: [Int]) -> [[Int]] {
323
323
}
324
324
```
325
325
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
+
326
397
-----------------------
327
398
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>
0 commit comments