示例 1:
示例 2:
void backTracking(参数)
{
if(终止条件)
{
保存结果;
return;
}
for(遍历从当前位置出发的所有“路径”)
{
if(大于开始位置 && 当前元素和前一个元素相同)
{
continue;
}
保存“路径”节点;
backTracking(所需参数);
回溯处理,删除上一步保存的“路径”节点,准备进行新的递归
}
}
package Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* @Author: IronmanJay
* @Description: 90.子集 II
* @CreateTime: 2022-11-25 09:04
*/
public class p90_SubsetsII {
public static void main(String[] args) {
int[] nums = {1, 2, 2};
List<List<Integer>> res = subsetsWithDup(nums);
System.out.println("res = " + res);
}
public static List<List<Integer>> subsetsWithDup(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> res = new ArrayList<>();
List<Integer> path = new ArrayList<>();
dfs_back_p90_SubsetsII(nums, res, path, 0);
return res;
}
public static void dfs_back_p90_SubsetsII(int[] nums, List<List<Integer>> res, List<Integer> path, int start) {
res.add(new ArrayList<>(path));
for (int i = start; i < nums.length; i++) {
if (i > start && nums[i] == nums[i - 1]) {
continue;
}
path.add(nums[i]);
dfs_back_p90_SubsetsII(nums, res, path, i + 1);
path.remove(path.size() - 1);
}
}
}
#include
#include
int compare_p90_SubsetsII(const void *a, const void *b)
{
return *(int *)a - *(int *)b;
}
void dfs_back_p90_SubsetsII(int* nums, int numsSize, int** res, int* returnSize, int** returnColumnSizes, int* path, int pathSize, int start)
{
res[*returnSize] = (int*)malloc(sizeof(int) * pathSize);
memcpy(res[*returnSize], path, sizeof(int) * pathSize);
(*returnColumnSizes)[*returnSize] = pathSize;
(*returnSize)++;
for (int i = start; i < numsSize; i++)
{
if (i > start && nums[i] == nums[i - 1])
{
continue;
}
path[pathSize++] = nums[i];
dfs_back_p90_SubsetsII(nums, numsSize, res, returnSize, returnColumnSizes, path, pathSize, i + 1);
pathSize--;
}
}
int** subsetsWithDup(int* nums, int numsSize, int* returnSize, int** returnColumnSizes)
{
qsort(nums, numsSize, sizeof(int), compare_p90_SubsetsII);
*returnSize = 0;
*returnColumnSizes = (int*)malloc(sizeof(int) * 10001);
int** res = (int**)malloc(sizeof(int*) * 10001);
int* path = (int*)malloc(sizeof(int) * numsSize);
dfs_back_p90_SubsetsII(nums, numsSize, res, returnSize, returnColumnSizes, path, 0, 0);
return res;
}
/*主函数省略*/
Java语言版

C语言版
