leetcode做题笔记90. 子集 II

这篇具有很好参考价值的文章主要介绍了leetcode做题笔记90. 子集 II。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。

思路一:回溯

int comp(const void* a, const void* b) {
  return *(int*)a - *(int*)b;
}
 void backtracking(int* nums, int numsSize, int** res, int* returnSize, int** returnColumnSizes, 
                  int* path, int pathSize, int startIndex) {
    res[*returnSize] = (int*)malloc(sizeof(int) * pathSize);
    memcpy(res[*returnSize], path, sizeof(int) * pathSize);
    (*returnColumnSizes)[*returnSize] = pathSize;
    (*returnSize)++;
    for (int i = startIndex; i < numsSize; i++) {
        
        path[pathSize] = nums[i];
        backtracking(nums, numsSize, res, returnSize, returnColumnSizes, path, pathSize + 1, i + 1);
        while (i < numsSize - 1 && nums[i] == nums[i + 1]) i++; 
    }
}

int** subsetsWithDup(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
    *returnSize = 0;
    *returnColumnSizes = (int*)malloc(sizeof(int) * 10001);
    int** res = (int**)malloc(sizeof(int*) * 10001);
    int* path = (int*)malloc(sizeof(int) * numsSize);
    qsort(nums, numsSize, sizeof(int), comp); 
    backtracking(nums, numsSize, res, returnSize, returnColumnSizes, path, 0, 0);
    return res;
}

分析:

本题与78子集问题很像,只需在78代码的基础上考虑数字重复问题即可,对于数字重复可先将数组内数组排序一遍再加上while (i < numsSize - 1 && nums[i] == nums[i + 1]) i++;这行代码即可解决

总结:

本题考察回溯的应用,考虑重复数字,对于nums[i] == nums[i + 1]直接跳过处理即可文章来源地址https://www.toymoban.com/news/detail-660896.html

到了这里,关于leetcode做题笔记90. 子集 II的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 90.子集II

    原题链接:90.子集II 思路: 重点就是去重 也就是同层的去重操作 全代码:

    2024年02月04日
    浏览(33)
  • 子集 II——力扣90

    题目描述

    2024年02月14日
    浏览(35)
  • leetcode做题笔记113. 路径总和 II

    给你二叉树的根节点  root  和一个整数目标和  targetSum  ,找出所有  从根节点到叶子节点  路径总和等于给定目标和的路径。 叶子节点  是指没有子节点的节点。 本题要求路径总和,可想到将每个数到叶子节点的路径总和,等到叶子节点时判断总和是否等于目标数,用数

    2024年02月11日
    浏览(39)
  • leetcode做题笔记92. 反转链表 II

    给你单链表的头指针  head  和两个整数  left  和  right  ,其中  left = right  。请你反转从位置  left  到位置  right  的链表节点,返回  反转后的链表  。 示例 1: 本题根据left值将指针移动到目标节点前一位,再通过头插法将节点反转,最后返回链表 本题考察链表的应用

    2024年02月12日
    浏览(49)
  • 代码随想录23| 93.复原IP地址, 78.子集, 90.子集II

    题目链接/文章讲解:链接地址 视频讲解:链接地址 题目链接/文章讲解:链接地址 视频讲解:链接地址 题目链接/文章讲解:链接地址 视频讲解:链接地址

    2024年02月11日
    浏览(90)
  • leetcode做题笔记107. 二叉树的层序遍历 II

    给你二叉树的根节点  root  ,返回其节点值  自底向上的层序遍历  。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 本题要求二叉树的层序遍历,并且是从下至上的层序遍历,可以考虑先按照从上至下的层序遍历先将层序遍历结果放到数组中,再对每层

    2024年02月11日
    浏览(38)
  • leetcode做题笔记95. 不同的二叉搜索树 II

    给你一个整数  n  ,请你生成并返回所有由  n  个节点组成且节点值从  1  到  n  互不相同的不同  二叉搜索树   。可以按  任意顺序  返回答案。 本题要列出所有二叉搜索树,即可转换为列举左子树所有集合和右子树所有集合两个问题,分别用递归函数将左右子树根节

    2024年02月11日
    浏览(32)
  • leetcode做题笔记80删除有序数组中的重复项 II

    给你一个有序数组  nums  ,请你  原地  删除重复出现的元素,使得出现次数超过两次的元素 只出现两次  ,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在  原地 修改输入数组  并在使用 O(1) 额外空间的条件下完成。 说明: 为什么返回数值是整数,但输

    2024年02月12日
    浏览(52)
  • leetcode做题笔记82删除排序链表中的重复元素 II

    给定一个已排序的链表的头  head  ,  删除原始链表中所有重复数字的节点,只留下不同的数字  。返回  已排序的链表  。 本题将重复的元素全部删除,可以考虑新建一个链表,若有重复元素则不放入新链表中,最后输出新链表即可。链表操作需要用另一个链表记录原来

    2024年02月12日
    浏览(59)
  • 【数据结构】回溯算法公式化解题 leetcode经典题目带刷:全排列、组合、子集

    一、什么是回溯算法 回溯算法(Backtracking Algorithm)是一种解决 组合问题 、 排列问题 、 选择问题 等一类问题的常用算法。它通过尝试所有可能的选择来找到问题的解,当发现当前选择不符合要求时,就回溯到之前的状态,然后尝试其他的选择。 1、基本思想: 从问题的起

    2024年02月11日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包