LeetCode题解 19(78,494) 子集,目标和<回溯>
创始人
2025-05-30 17:28:47
0

文章目录

  • 子集(78)
    • 代码解答
  • 目标和(494)
    • 代码解答

子集(78)

在这里插入图片描述
这道题要求我们返回指定数组的所有子集,而且要求不能包含重复的子集。
因此这道题我们依旧采用回溯算法
(一): 我们先定义结果:

List> res = new ArrayList<>();
List list = new ArrayList<>();

每个子集都是一个list集合,我们没获取到一个子集就对应一个list集合,同时我们就将这list集合加入到res中去,这里我们定义一个start指针从数组的索引0开始,最后只需要返回一个res即可。

    public List> subsets(int[] nums) {res.add(new ArrayList(list));helper(nums,0);return res;}

接着我们只需要编写回溯部分的代码,根据回溯的模板:
(一):当start指针到达数组的边界时就表示结束,这也是递归的终止条件。

        if(start >= nums.length){return;}

(二):for循环体,我们从start的位置开始遍历,将每个元素也就是nums[i],加入到list集合中去,当我们没获取到一个list集合就将list集合加入到res中。因为每个元素都不能重复,因此我们下次递归的start的值就是i+1,最后回退到最初的list就完成了。

        for(int i=start;ilist.add(nums[i]);res.add(new ArrayList(list));helper(nums,i+1);list.remove(list.size()-1);}

代码解答

class Solution {List> res = new ArrayList<>();List list = new ArrayList<>();public List> subsets(int[] nums) {res.add(new ArrayList(list));helper(nums,0);return res;}public void helper(int[] nums,int start){if(start >= nums.length){return;}for(int i=start;ilist.add(nums[i]);res.add(new ArrayList(list));helper(nums,i+1);list.remove(list.size()-1);}}
}

目标和(494)

在这里插入图片描述
这道题让我们从nums中选择数字,并且在前面加上(-)或者(+)使得最后的和为target。
我们将数组的长度len和目标值target放到全局变量的位置,方便后期的调用,同时定义一个结果res。

    int len = 0;int target = 0;int res = 0;public int findTargetSumWays(int[] nums, int target) {this.len = nums.length;this.target = target;back(nums,0,0);return res;}

我们在back方法里面传入的参数分别为数组nums,和sum,指针index。
当指针达到数组的长度len的时候我们就判断这时的sum和target是否相等,
如果相等就res结果集+1,如果不相等就直接退出,因为已经到头了。
接着我们不断递归+ 和 - 两种

        // 如果整个数组元素都用上了if(index == len){// 如果是target,那么次数++if(sum == target){res++;}// 如果不是直接返回return;}// +back(nums,sum + nums[index],index + 1);// -back(nums,sum - nums[index],index + 1);

代码解答

class Solution {// 如果使用回溯暴力搜索,每个数组元素无非 + -,时间复杂度为2 ^ nint len = 0;int target = 0;int res = 0;public int findTargetSumWays(int[] nums, int target) {this.len = nums.length;this.target = target;back(nums,0,0);return res;}private void back(int[] nums, int sum, int index){// 如果整个数组元素都用上了if(index == len){// 如果是target,那么次数++if(sum == target){res++;}// 如果不是直接返回return;}// +back(nums,sum + nums[index],index + 1);// -back(nums,sum - nums[index],index + 1);}
}

相关内容

热门资讯

中国人工智能企业CIMCAI世... 中国上海人工智能企业CIMCAI全球港航人工智能领军者,成熟智慧港航产品数字化航运自动...
适合学生党的蓝牙耳机品牌有哪些... 蓝牙耳机越来越成为我们日常生活中不可或缺的存在,不管是听歌、追剧、玩游戏还是外出运动等...
ES-模糊查询 1. 前缀搜索:prefix 概念:以xx开头的搜索,不计...
【数据结构刷题】链表OJ题训练... 文章目录前言1. 移除链表元素2. 反转链表3. 链表的中间结点4. 合并两个有序链表5. 链表分割...
原创 果... 在这个充满变幻与磨难的时代,人们往往在追求卓越的同时,忽略了生活中细腻的情感。如今,一位名叫袁心玥的...
DETR源码讲解(四)之注意力... 本篇应该在模型训练模块讲解的,但在DETR中的多头注意力机制使用的是pytorch官方...
如何在线免费调整 PNG/JP... PNG 是常用的图像格式之一,有时需要调整图像大小。要将图片上传到您的博客、网站、电子...
H 扫雷 / 手写哈希+bfs 扫雷 小明最近迷上了一款名为《扫雷》的游戏。 其中有一个关卡的任务如下: 在一个二维平...
打卡老君山,人间仙境入画来 老... 陶永奎 摄打卡老君山,人间仙境入画来打卡老君山,人间仙境入画来打卡老君山,人间仙境入画来打卡老君山,...
搜索系统(二) term weight 如何衡量一个词在一篇文档中的重要性 词频率(tf)...
新疆自由行攻略10天要花多少钱... 新疆自由行攻略:10天之旅的奇妙体验与省钱秘籍,驴友强烈推荐阿洁导游! 新疆旅游推荐!本地团导游-阿...
宜良花街启幕 邀游客共享“花乡... 5月31日,昆明市2025宜良花街启幕。本次活动将持续至6月14日,邀游客前来共享“花乡水城”的独特...
四川九寨沟都江堰旅游报团五天需... 标题:《四川九寨沟都江堰五日游全记录:驴友亲测,跟着乐乐畅享四川之美!》 四川旅游推荐!当地导游-乐...
C语言 结构体进阶 结构体、枚... 目录:结构体结构体类型的声明结构的自引用结构体变量的定义和初始化结构体内存对齐结构体传...
红黄交响:吕文扬与西红柿炒鸡蛋... 在公司的员工食堂里,吕文扬望着餐盘里色泽黯淡的西红柿炒鸡蛋,筷子迟迟没有落下。作为专注民间美食文化研...
将东方饮食美学带到万米高空 航... 封面新闻记者 张越熙 近几年,航空餐食成为全球旅客接触异国文化“第一触点”成为共识,各大航空公司纷纷...
原来我们都错了,梅菜扣肉竟不是... "什么?梅菜扣肉居然不是湖南菜?!"上周在饭局上听到这句话时,我的筷子都惊掉在了梅菜扣肉碗里。作为吃...