限制条件子集 --- lintcode 818
2018-03-08 15:57
239 查看
已知:
给定一个数组,给定一个target,求满足下面条件的所有子集个数:
条件:子集的最小值和最大值要小于给定的target。
示例:
给定nums = [1,5,2,4,3],给定target为5,返回为5.
五个子集如下: [1] [2] [1,2] [1,3] [1,2,3]
思路:
首先,子集不能为空:
如果子集只有一个数,那么计算下原数组中大小不到target一半的数,这是结果的第一个来源。
如果子集有两个及以上的数,假设最大数下标为x,最小数下标为y,则总共有2^(y - x -1)种可能性
(假设y和x之间有n个数字,每个数字为0或者1,总共就是2^n种可能性,且每一种都不一样)
综上,代码如下:public class Solution {
public long subsetWithTarget(int[] nums, int target) {
Arrays.sort(nums);
long ret = 0;
for (int num : nums) {
if (2 * num < target) {
ret++;
}
}
loop: for (int i = 0; nums[i] < target; i++) {
int j = nums.length - 1;
while (nums[i] + nums[j] >= target) {
j--;
}
if (j <= i) {
break loop;
}
while (i < j) {
ret += Math.pow(2, j - i - 1);
j--;
}
}
return ret;
}
}
给定一个数组,给定一个target,求满足下面条件的所有子集个数:
条件:子集的最小值和最大值要小于给定的target。
示例:
给定nums = [1,5,2,4,3],给定target为5,返回为5.
五个子集如下: [1] [2] [1,2] [1,3] [1,2,3]
思路:
首先,子集不能为空:
如果子集只有一个数,那么计算下原数组中大小不到target一半的数,这是结果的第一个来源。
如果子集有两个及以上的数,假设最大数下标为x,最小数下标为y,则总共有2^(y - x -1)种可能性
(假设y和x之间有n个数字,每个数字为0或者1,总共就是2^n种可能性,且每一种都不一样)
综上,代码如下:public class Solution {
public long subsetWithTarget(int[] nums, int target) {
Arrays.sort(nums);
long ret = 0;
for (int num : nums) {
if (2 * num < target) {
ret++;
}
}
loop: for (int i = 0; nums[i] < target; i++) {
int j = nums.length - 1;
while (nums[i] + nums[j] >= target) {
j--;
}
if (j <= i) {
break loop;
}
while (i < j) {
ret += Math.pow(2, j - i - 1);
j--;
}
}
return ret;
}
}
相关文章推荐
- LintCode每日一练-限制条件子集
- 划分和相等的子集-LintCode
- memcached注意事项与应用范围、应用条件、限制
- lintcode-带重复元素的子集-18
- Oracle中查询时候使index索引失效的限制条件
- SQL Server视图中常見限制条件
- 能使 Oracle 索引失效的六大限制条件
- HDU3466 Proud Merchants[背包DP 条件限制]
- 传输表空间的使用条件、限制和适用场景--总结
- 要将表的限制条件写到与该表同级别的where中
- MySQL不带where条件的UPDATE和DELETE 限制操作说明
- mysql union 连用 order by 的限制条件
- Roads带限制条件的最短路算法
- poj 1724 有限制条件的最短路
- 物化视图 快速刷新限制条件
- 【ORACLE】物化视图快速刷新限制条件
- JTextField之限制输入条件(长度,类型)
- 12、Oracle:order by 排序和限制条件
- ITPUB BLOG申请没有限制条件了!
- 学习MongoDB 八: MongoDB索引(索引限制条件)(二)