【问题标题】:Find the size of minimal possible set after operations求运算后最小可能集的大小
【发布时间】:2022-11-03 00:36:28
【问题描述】:

给定一个数组,每个元素由三个数字 [start, end, x] 组成。
数组 [start,end,x] 的元素意味着我们必须从 [start,end] 中精确选择 x 个整数,包括 start 和 end。将这些数字放在一个集合中。对数组的所有元素执行此操作。所以最后 Set 会有一个大小。返回最小的可能大小。 Example Array= [1,3,2],[2,5,3],[5,6,2]
从第一个元素选择 2,3 从第二个选择 2,3,5 并从第三个选择 5,6 所以选择的数字集 = 2,3,5,6 有 4 个元素,这是最小值。所以对于这个输入,答案或返回值为4

我的想法:
我试图想出一些最优的子结构属性,希望它能产生一个 DP 解决方案,但看起来这里没有明确的最优子结构属性。

【问题讨论】:

  • 您对此有任何问题链接吗?
  • 似乎是沿着重叠间隔的线或有点像合并 k 排序数组。

标签: java algorithm dynamic-programming


【解决方案1】:

这是使用消除重复项的 Set 的一种方法。

  • 遍历数组数组。
  • 使用随机整数
    • 第一个参数是流的长度
    • 秒是起始值
    • 第三个是绑定的(排他的)所以加 1。
    • 返回数组
    • 添加设置,打印尺寸
Random r = new Random();
int[][] arr = { { 1, 3, 2 }, { 2, 5, 3 }, { 5, 6, 2 } };
Set<Integer> set = new HashSet<>();
for (int[] a : arr) {
    int[] items = r.ints(a[2], a[0], a[1] + 1).toArray();
    for (int i : items) {
        set.add(i);
    }
}
System.out.println(set.size());

使用流,您可以这样做。假设 Random r 已被实例化。

  • 流式传输数组数组。
  • 生成所需的值。 r.ints 返回一个流,因此 flatMapToInt 将这些值作为单独的值放在这些流上。
  • 使用distinct 过滤重复项
  • 并获得count()
int result = (int)Arrays.stream(arr)
        .flatMapToInt(a -> r.ints(a[2], a[0], a[1] + 1))
        .distinct().count();
        
System.out.println(result);

还有其他方法可以通过收集到一个集合来处理流。这会将.distinct() 替换为.boxed() 以转换为对象,然后将toArray() 替换为collect(Collectors.toSet()) 以返回一个集合并获取大小。

注意:Random 的每次运行或随后的 Random 调用都会生成新值,因此您可以添加种子以使它们在运行之间保持不变。

【讨论】:

  • 但问题要求返回数字 n,这是选择的不同数字的最小数量
  • 我很抱歉。我专注于阵列。这有帮助吗?
猜你喜欢
  • 1970-01-01
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
  • 1970-01-01
  • 2013-05-17
  • 2011-03-09
  • 1970-01-01
相关资源
最近更新 更多