LeetCode·491.递增子序列·递归+回溯+剪枝
2023-09-27 14:26:29 时间
链接:https://leetcode.cn/problems/increasing-subsequences/solution/-by-xun-ge-v-6fmq/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题目
示例
思路
解题思路
本题我们使用递归枚举所有递增子序列,并且保存有效的子序列,在枚举过程中,我们可以判断前后元素的大小值,只当遇到前者小后者大时,才进行下一次递归,同时申请一个数组,进行同层去重
代码注释超级详细
代码
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
void backtracking(int* nums, int numsSize, int** res, int* returnSize, int** returnColumnSizes, int* path, int pathSize, int startIndex) {
/* 终止条件,元素个数大于等于2个 */
if (pathSize >= 2) {
/* 为当前返回值分配空间 */
res[*returnSize] = (int*)malloc(sizeof(int) * pathSize);
/* 赋值 */
memcpy(res[*returnSize], path, sizeof(int) * pathSize);
/* 当前返回值的列数 */
(*returnColumnSizes)[*returnSize] = pathSize;
/* 返回行数加一 */
(*returnSize)++;
}
/* 当前层使用过的元素,每一层都有会有一个这样的used数组 */
int used[201] = {0};
for (int i = startIndex; i < numsSize; i++) {
/* 当前路径中的当前元素小于上一个元素、或者当前中当前元素之前以及使用过 */
if ((pathSize > 0 && nums[i] < path[pathSize - 1]) || used[nums[i] + 100] == 1) {
continue;
}
/* 记录当路径数组中 */
path[pathSize] = nums[i];
/* 因为此题输入元素在-100到100之间,使用加100这个操作,
* 使得used中的下表落在0到200之间,这样就可以记录当前层元素的使用情况
*/
used[nums[i] + 100] = 1;
backtracking(nums, numsSize, res, returnSize, returnColumnSizes, path, pathSize + 1, i + 1);
}
return;
}
int** findSubsequences(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) {
/* 返回数组行数 */
*returnSize = 0;
/* 特判,递增子序列最少需要两个元素 */
if (numsSize < 2) {
return NULL;
}
/* 返回数组中每一行的列数 */
*returnColumnSizes = (int*)malloc(sizeof(int) * 32768);
/* 返回数组 */
int** res = (int**)malloc(sizeof(int*) * 32768);
/* 当前路径数组 */
int path[numsSize];
backtracking(nums, numsSize, res, returnSize, returnColumnSizes, path, 0, 0);
return res;
}
作者:xun-ge-v
链接:https://leetcode.cn/problems/increasing-subsequences/solution/-by-xun-ge-v-6fmq/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
相关文章
- LeetCode每日一练 —— 160. 相交链表
- LeetCode每日一练 —— 203. 移除链表元素
- 【LeetCode】最长连续序列 [M](数据结构设计)
- 【LeetCode】最长回文子序列(动态规划)
- [LeetCode]Subsets II生成组合序列
- LeetCode_数学推导_困难_891.子序列宽度之和
- LeetCode_多指针_二分搜索_中等_792.匹配子序列的单词数
- LeetCode_滑动窗口_中等_904.水果成篮
- LeetCode_二叉平衡树_简单_110.平衡二叉树
- LeetCode_动态规划_困难_801.使序列递增的最小交换次数
- LeetCode_动态规划_困难_44.通配符匹配
- LeetCode_矩形_困难_391.完美矩形
- LeetCode_动态规划_二分搜索_耐心排序_中等_300.最长递增子序列
- leetcode 152 乘积最大子序列
- LeetCode刷题(19)【简单】二叉树的前&&中&&后遍历(非递归)(C++)
- LeetCode·每日一题·940.不同的子序列 || · 动态规划
- LeetCode·每日一题·801.使序列递增的最小交换次数·动态规划
- LeetCode·105.从前序与后序遍历序列构造二叉树·递归
- LeetCode·每日一题·剑指 Offer || 115.重建序列·拓扑排序
- [LeetCode] 768. Max Chunks To Make Sorted II 可排序的最大块数 II
- [LeetCode] 659. Split Array into Consecutive Subsequences 将数组分割成连续子序列
- [LeetCode] 674. Longest Continuous Increasing Subsequence 最长连续递增序列
- [LeetCode] 673. Number of Longest Increasing Subsequence 最长递增序列的个数
- [LeetCode] 533. Lonely Pixel II 孤独的像素 II
- [LeetCode] 128. Longest Consecutive Sequence 求最长连续序列
- [LeetCode] 516. Longest Palindromic Subsequence 最长回文子序列
- [LeetCode] 727. Minimum Window Subsequence 最小窗口子序列
- leetcode 84 柱状图中最大的矩形
- leetcode 115 不同的子序列
- leetcode 674 最长连续递增序列
- leetcode 128 最长连续序列