已知:
给定一个数组,给定一个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; } }