当前位置: 首页 > news >正文

做游戏装备网站可以吗科技建筑公司网站

做游戏装备网站可以吗,科技建筑公司网站,免费linux网站空间,有了页游源代码如何做网站子集 [78]子集I 题目描述 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例输入 示例 1: 输入:nums [1, 2, 3…

子集

[78]子集I

题目描述

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

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

示例输入

示例 1:

输入:nums = [1, 2, 3]

输出:[[], [1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]

示例 2:

输入:nums = [0]

输出:[[], [0]]

题解

这道题目考察的是如何获取一个数组的幂集,核心思想是幂运算。

public List<List<Integer>> subsets(int[] nums) {List<List<Integer>> ans = new ArrayList<>();int n = nums.length;for (int i = 0; i < (1 << n); i++) {List<Integer> subset = new ArrayList<>();for (int j = 0; j < n; j++) {if ((i & (1 << j)) != 0) {subset.add(nums[j]);}}ans.add(subset);}return ans;
}

这段代码难点在于第7行的条件判断,不容易想到,下面解释一下:

i 是从 0 到 2^n - 1 的整数,它的二进制表示中每一位对应着一个元素是否包含在子集中。例如:

  • i = 0 时,二进制是 000,表示空集([])。

  • i = 1 时,二进制是 001,表示只包含第 0 个元素([1])。

  • i = 2 时,二进制是 010,表示只包含第 1 个元素([2])。

  • i = 3 时,二进制是 011,表示包含第 0 个和第 1 个元素([1,2])。

  • i = 4时,二进制是 100,表示只包含第二个元素 [3]

  • i = 5时,二进制是 101,表示包含第 0 个和第 2 个元素([1,3])。

  • i = 6时,二进制是 110,表示包含第 1 个和第 2 个元素([2,3])。

  • i = 7时,二进制是 111,表示包含所有元素 ([1,2,3])

观察上面我们就能看出来,遇到二进制是 1 的情况,就把那个元素加到一个子列表里面。

我们判断i的第j位是不是 1可以用位运算实现:i & (1 << j)) != 0

[90]子集II

题目描述

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

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

示例输入

示例 1:

输入:nums = [1, 2, 2]

输出:[[], [1], [1, 2], [2], [2, 2], [1, 2, 2]]

示例 2:

输入:nums = [0]

输出:[[], [0]]

题解

和上面相比就是增加了对重复元素的检查,如果重复就不要加入最终要返回的列表了。

需要注意的是题目中像[1, 2]和[2, 1]认为是相同的,所以对subset要排个序再检查。

public List<List<Integer>> subsetsWithDup(int[] nums) {List<List<Integer>> ans = new ArrayList<>();int n = nums.length;for (int i = 0; i < (1 << n); i++) {List<Integer> subset = new ArrayList<>();for (int j = 0; j < n; j++) {if ((i & (1 << j)) != 0) {subset.add(nums[j]);}}subset.sort(Comparator.naturalOrder());if (! ans.contains(subset)) {ans.add(subset);}}return ans;
}

但这个方法比较耗时间,可以接着想怎么通过位运算改进他。

比如我们看这个 nums = [1, 2, 2]

1	2	20	0	0		[]
0	0	1		[1]
0	1	0		[2]
0	1	1		[1, 2]
1	0	0		[2]
1	0	1		[2, 1]
1	1	0		[2, 2]
1	1	1		[1, 2, 2]

我们注意到:

[2]这个子集出现了两次,对应的是:

0	1	0		[2]
1	0	0		[2]

[1, 2]这个子集也出现了两次,对应的是:

0	1	1		[1, 2]
1	0	1		[2, 1]

那么怎么去重复呢?

有两种情况:

第一种就是,占据了开头,类似于这种 101

第二种就是,没有占据开头,类似于这种 0100,对应 [2]这个子集

除了第一位,其他位的 1 的前边一定是 0。

所以的话,我们的条件是看出现了重复数字,并且当前位是 1 的前一个的二进位。

public List<List<Integer>> subsetsWithDup(int[] num) {Arrays.sort(num);List<List<Integer>> lists = new ArrayList<>();int subsetNum = 1 << num.length;for (int i = 0; i < subsetNum; i++) {List<Integer> list = new ArrayList<>();boolean illegal = false;for (int j = 0; j < num.length; j++) {//当前位是 1if ((i >> j & 1) == 1) {//当前是重复数字,并且前一位是 0,跳过这种情况if (j > 0 && num[j] == num[j - 1] && (i >> (j - 1) & 1) == 0) {illegal = true;break;} else {list.add(num[j]);}}}if (! illegal) {lists.add(list);}}return lists;}
http://www.yayakq.cn/news/485554/

相关文章:

  • 广州网站设计找哪里建网站需要营业执照吗
  • 鼓楼区建设局网站松江新城投资建设集团有限公司网站
  • 网站建设的公司开发怎么推广产品最有效
  • 便利的集团网站建设互联网建造公司有哪些
  • 新网站建设的感想wordpress可以做
  • wordpress站点名没有更改wordpress修改主题目录
  • 上海网站建设公司地址导购网站如何做淘宝客
  • 做ppt卖给网站开发平台都有哪些
  • 德阳企业品牌网站建设传媒网站后台免费模板
  • 网站建设答辩内容为什么有些网站看不到百度快照
  • 推荐 网站空间做服装网站宣传
  • 个人资料库网站怎么做wordpress页面标题标签
  • 各种浏览器网站大全营销品牌推广公司
  • 网站没备案做淘宝客可信网站认证不在有用吗
  • 网站建设制作网站产品定制网站开发
  • 网站semseo先做哪个网站的导入流量怎么做
  • 如何免费建网站赚钱南昌市建设局网站
  • 婚纱网网站建设目的及功能定位厦门招聘网
  • 全屏网站帮助建设政协网站的意义
  • 基于jsp的电子商务网站开发百度云做网站空间
  • 电商网站开发要多少钱建设网站费用要进固定资产吗
  • 包头正大光电 做网站wordpress相册编辑插件
  • 新媒体营销策略分析东莞推广优化关键词优化
  • 朔州企业网站建设公司本地数据库搭建网站
  • 国外红色企业网站如何用网站做cpa
  • 做网站的热门行业德州哪个做网站做得好
  • 网站导航条用什么做商业网站建设公司
  • 湖北网站建设软件有哪些女生就业前景最好的十大热门专业
  • 0基础网站建设模板怎么找客户资源
  • 池州网站网站建设铁岭免费网站建设