78. Subsets

文章目录

  • 1 题目理解
  • 2 回溯
  • 90 subset II
    • 方式一代码
    • 方式三代码

1 题目理解

Given an integer array nums, return all possible subsets (the power set).
The solution set must not contain duplicate subsets.
输入:int数组nums
输出:返回所有可能的子数组,不能重复
例如
Input: nums = [1,2,3]
Output: [[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

2 回溯

子数组中可能不包含任意一个元素,子数组的长度可能是0,1,2…n。我们可以对长度为1的子数组先做回溯,再对长度为2的子数组做回溯。
子数组长度为k的时候,第0位可能是从0到n选择一个数,第1位可能是从上一步选择的位置到n选择一个数。
例如k=2,
第0位,从0到n选择一个,如果选择1,进入状态dfs(2,1)
第1位的时候,从2到n选择一个,如果选择3,进入状态dfs(4,0)
这时候2个数都已经选好了,将组合填入到结果集

class Solution {private List<List<Integer>> answer;private int[] nums;public List<List<Integer>> subsets(int[] nums) {answer = new ArrayList<List<Integer>>();int n = nums.length;this.nums = nums;answer.add(new ArrayList<Integer>());for(int i=1;i<=n;i++){dfs(0,i, new ArrayList<Integer>());}return answer;}private void dfs(int index,int k,List<Integer> list){if(k==0){answer.add(new ArrayList<Integer>(list));return;}if(index>=nums.length) return ;for(int i=index;i<nums.length;i++){list.add(nums[i]);dfs(i+1,k-1,list);list.remove(list.size()-1);}}
}

还有一种思路是,每个元素可能选择也可能不选择。对每个元素进行回溯。

class Solution {private List<List<Integer>> answer;private int[] nums;public List<List<Integer>> subsets(int[] nums) {answer = new ArrayList<List<Integer>>();int n = nums.length;this.nums = nums;dfs(0,new ArrayList<Integer>());return answer;}private void dfs(int index,List<Integer> list){if(index>=nums.length){answer.add(new ArrayList<Integer>(list));return;}list.add(nums[index]);dfs(index+1,list);list.remove(list.size()-1);dfs(index+1,list);}
}

这种思路还有一种二进制的写法。因为每个元素选择不选择,可以用二进制位表示。数组长度为n,那么可以表示的数就是[0,2n−1][0,2^n-1][0,2n1]

class Solution {public List<List<Integer>> subsets(int[] nums) {List<List<Integer>> answer = new ArrayList<List<Integer>>();int n = nums.length;int max = (1<<n)-1;for(int i=0;i<=max;i++){List<Integer> list = new ArrayList<Integer>();for(int j=0;j<n;j++){if(((i>>j) &1)==1 ){list.add(nums[j]);}}answer.add(list);}return answer;}
}

90 subset II

Given a collection of integers that might contain duplicates, nums, return all possible subsets (the power set).

Note: The solution set must not contain duplicate subsets.

Example:

Input: [1,2,2]
Output:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
同样是找子数组。这次nums可能包含重复元素。在有重复元素做选择的时候,相同元素,就要选择第一个,第一个不选择,第二个也不能选择。例如[8,8],可以两个都不选择;也可以选择第1个8,不选择第2个8;也可以选择第1个8,第2个8。但是不选择第1个8,选择第2个8,就会出现重复,不能这样选。
可以采取的方式有三种。一种是先对数组排序。排序之后,在不选择某个元素的时候,状态转移的时候要找到下一个不等于当前元素的数。这种方式在40. Combination Sum II 遇到过。
第二种采取计数的方式,提前计算好每个元素可以使用的次数。这种方式写代码不太好处理,忽略。
第三种是用一个数组记录是否使用了某个元素。在和前一个元素值相同的时候,前一个元素不使用,第二个元素也不使用。

方式一代码

class Solution {private List<List<Integer>> answer;private int[] nums;public List<List<Integer>> subsetsWithDup(int[] nums) {answer = new ArrayList<List<Integer>>();int n = nums.length;this.nums = nums;Arrays.sort(nums);dfs(0,new ArrayList<Integer>());return answer;}private void dfs(int index,List<Integer> list){if(index>=nums.length){answer.add(new ArrayList<Integer>(list));return;}list.add(nums[index]);dfs(index+1,list);list.remove(list.size()-1);while(index+1<nums.length && nums[index+1]==nums[index]) index++;dfs(index+1,list);}
}

方式三代码

class Solution {private List<List<Integer>> answer;private int[] nums;private boolean[] visited;public List<List<Integer>> subsetsWithDup(int[] nums) {answer = new ArrayList<List<Integer>>();int n = nums.length;this.nums = nums;visited = new boolean[n];Arrays.sort(nums);dfs(0,new ArrayList<Integer>());return answer;}private void dfs(int index,List<Integer> list){if(index>=nums.length){answer.add(new ArrayList<Integer>(list));return;}if(!(index>0 && nums[index]==nums[index-1] && !visited[index-1])){list.add(nums[index]);visited[index]=true;dfs(index+1,list);list.remove(list.size()-1);visited[index]=false;}dfs(index+1,list);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424229.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第九十八期:TIOBE11月榜单:C、Swift、Go、D与Rust起起伏伏

TIOBE 指数并不代表语言的好坏&#xff0c;开发者可以使用该榜单检查自身的编程技能是否需要更新&#xff0c;或者在开始构建新软件时对某一语言做出选择。 作者&#xff1a;oschina TIOBE 公布了 11 月份编程语言排行榜。 本月前 20 名中有一些有趣的现象&#xff0c;先看看…

Vue 之 slot(插槽)

前言&#xff1a; vue中关于插槽的文档说明很短&#xff0c;语言又写的很凝练&#xff0c;再加上其和methods&#xff0c;data&#xff0c;computed等常用选项在使用频率、使用先后上的差别&#xff0c;这就有可能造成初次接触插槽的开发者容易产生“算了吧&#xff0c;回头再学…

sharepoint安装心得_过程

sharepoint安装心得_过程 我是新手,没有接触过sharepoint以前,所有在安装方面吃了一些亏 下面说一下正确的顺序: windows 2003 域服务器(ad) vs.net(如果需要的话,但不要装windows的frontpage的扩展,虽然.net需要,不装亦可) sqlserver 2000(sp3) sharepoint server 2003卸载顺序…

46. Permutations

文章目录1题目理解2 回溯3 47. Permutations II1题目理解 Given an array nums of distinct integers, return all the possible permutations. You can return the answer in any order. 输入&#xff1a;整数数组nums&#xff0c;所有元素不相同 输出&#xff1a;数组的所有…

第九十九期:可以编写代码的代码:代码生成的利与弊

代码生成的当前状态是无处不在的&#xff08;2019年春季&#xff09;。REST API的数量激增&#xff0c;导致在过去十年中针对各种编程语言和环境开发的API客户端生成器种类繁多。 作者&#xff1a;约翰麦克马洪 代码生成的当前状态 代码生成的当前状态是无处不在的&#xff0…

TD商用将迈重要一步 六大运营商年底建网试验

TD商用将迈重要一步 六大运营商年底建网试验 中国电信、中国网通、中国移动、中国联通、中国铁通和中国卫通同时开动 TD-SCDMA独立组网实验即将迈出重要一步。 昨天记者从知情人士处获悉&#xff0c;如无意外&#xff0c;参加信产部组织的TD-SCDMA外场第三阶段测试的系统厂商将…

天气预报的Ajax效果

最近在网站上看了很多显示实时天气预报的&#xff0c;挺实用而且用户体验也不错。对用户的帮助也比较大&#xff0c;用户可以通过你的网站了解到实时的天气信息。感觉比较有意思&#xff0c;于是自己钻研了一下其中的实现方法。于是决定把代码分享给大家&#xff0c;希望能对大…

784. Letter Case Permutation

文章目录1 题目理解2 回溯1 题目理解 Given a string S, we can transform every letter individually to be lowercase or uppercase to create another string. Return a list of all possible strings we could create. You can return the output in any order. 输入&…

第一百期:Java架构师:高并发下的流量控制

这个时候如果不做任何保护措施&#xff0c;服务器就会承受很大的处理压力&#xff0c;请求量很高&#xff0c;服务器负载也很高&#xff0c;并且当请求超过服务器承载极限的时候&#xff0c;系统就会崩溃&#xff0c;导致所有人都不能访问。 作者&#xff1a;IT技术分享 这个…

DB2常用傻瓜问题1000问(之一)

1.DB2产品的级别有那些?企业版的 ENTERPRISE EDITION工作组版 WORK GROUP EDITION企业扩展版 ENTERPRISE EXTEND EDEDITION个人版的 PERSONAL EDITION卫星版的 SATELLITE EDITION微型版的 EVERYPLACE2.可以连接到DB2数据库的产品有哪些?  DB2客户…

OpenCV学习笔记:矩阵的掩码操作

矩阵的掩码操作很简单。其思想是&#xff1a;根据掩码矩阵&#xff08;也称作核&#xff09;重新计算图像中每个像素的值。掩码矩阵中的值表示近邻像素值&#xff08;包括该像素自身的值&#xff09;对新像素值有多大影响。从数学观点看&#xff0c;我们用自己设置的权值&#…

spring mvc学习(15)Referenced file contains errors

SSM项目中出现Referenced file contains errors (http://www.springframework.org/schema/mvc/spring-mvc-3.0.xs 2019-01-20 22:37:06 薛定谔小猫Historia 阅读数 468更多 分类专栏&#xff1a; java及其框架学习 版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循…

996. Number of Squareful Arrays

文章目录1 题目理解2 回溯分析1 题目理解 Given an array A of non-negative integers, the array is squareful if for every pair of adjacent elements, their sum is a perfect square. Return the number of permutations of A that are squareful. Two permutations A1…

[置顶] export命令-linux

export 命令 功能说明&#xff1a; 设置或显示环境变量。 语 法&#xff1a; export [-fnp][变量名称][变量设置值] 补充说明&#xff1a; 在shell中执行程序时&#xff0c;shell会提供一组环境变量。 export可新增&#xff0c;修改或删除环境变量&#xff0c;供后续执行的程…

商业业智能的概念

商业业智能是什么?简而言之,它是能够帮助用户对自身业务经营做出正确明智决定的工具。一般现代化的业务操作,通常都会产生大量的数据,如订单、库存、交易帐目、通话记录、及客户资料等。如何利用这些数据增进对业务情况的了解,帮助我们在业务管理及发展上作出及时、正确的判断…

spring mvc学习(16)Could not publish server configuration for Tomcat v8.0 Server at localhost.

这个问题本质是我们有多个重名项目&#xff0c;为什么我们会有多个重名项目&#xff0c;其实一般都是我们删除以前的项目&#xff0c;然后再把它重新导进eclipse时以前的项目删除不彻底造成的&#xff0c;以前的项目在"Servers"里面的"server.xml"文件下的…

产品管理:启示录 - 特约客户、产品验证、原型测试

• 如何挑选有潜力的产品&#xff1f; • 如何证明产品设计符合用户需求&#xff1f; • 如何确认产品设计满足三个基本条件&#xff1f; • 如何运用敏捷方法管理产品&#xff1f; • …… 这是《启示录》上说的一些话&#xff0c;去年看了一下&#xff0c;和团队分享了其中几…

37. Sudoku Solver

文章目录1 题目理解2 回溯1 题目理解 Write a program to solve a Sudoku puzzle by filling the empty cells. A sudoku solution must satisfy all of the following rules: Each of the digits 1-9 must occur exactly once in each row. Each of the digits 1-9 must oc…

spring mvc学习(17)Intellij IDEA创建maven项目无java文件问题

1.解决之前项目结构如下&#xff1a; 2.选择File->Project Structure... 3.选择Modules选项卡下面的Sources项&#xff0c;在main文件夹上右键&#xff0c;选择New Folder...并点击OK   4.输入要创建的文件夹名称java&#xff0c;并点击OK继续 5.在创建好的java文件夹上右…

SQL Server 2005中的ROW_NUMBER和RANK

下面介绍两个SQL Server 2005 中的新东东&#xff1a;ROW_NUMBER返回结果集分区内行的序列号&#xff0c;每个分区的第一行从 1 开始。语法&#xff1a;ROW_NUMBER ( ) OVER ( [ <partition_by_clause> ] <order_by_clause> )备注&#xff1a;ORDER BY 子句可确…