给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。
数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。
示例 1:
输入:nums = [4,6,7,7] 输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]] 示例 2:
输入:nums = [4,4,3,2,1] 输出:[[4,4]]
提示:
1 <= nums.length <= 15 -100 <= nums[i] <= 100
来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/increasing-subsequences 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:这个题目的关键在于如何找到同层下一个符合条件的节点,同层的节点不能有重复,同时同一条分支上面的节点要保证是底层的顺序,所以就需要在同层搜索的时候进行限制,找到合法的节点,其余的都是模板的步骤,顺序实现即可
void backtracking(int start, int* nums, int numsSize, int** ans, int* returnSize, int* col, int* path, int pathSize)
{
if (pathSize > 1) {
ans[*returnSize] = (int*)malloc(sizeof(int) * pathSize);
int j;
for (j = 0; j < pathSize; j++) {
ans[*returnSize][j] = path[j];
}
col[(*returnSize)++] = pathSize;
}
if (start >= numsSize) {
return;
}
int i;
for (i = start; i < numsSize; i++) {
if (pathSize > 0 && nums[i] < path[pathSize - 1]) continue;
int k, flag = 0;
for (k = start; k < i; k++) {
if (nums[i] == nums[k]) {
flag = 1;
break;
}
}
if (flag == 1) continue;
path[pathSize++] = nums[i];
backtracking(i + 1, nums, numsSize, ans, returnSize, col, path, pathSize);
pathSize--;
}
}
int** findSubsequences(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
int* path = (int*)malloc(sizeof(int) * numsSize);
int pathSize = 0;
int** ans = (int**)malloc(sizeof(int*) * 1008611);
int* col = (int*)malloc(sizeof(int) * 1008611);
*returnColumnSizes = col;
*returnSize = 0;
if (numsSize < 2) return ans;
backtracking(0, nums, numsSize, ans, returnSize, col, path, pathSize);
return ans;
}
|