【问题标题】:M Blossoming Groups of length atleast KM个长度至少为K的开花群
【发布时间】:2018-08-01 00:39:44
【问题描述】:

我最近在一次采访中被问到这个问题,我仍然想不出一个解决方案。

有一个有 N 个插槽的花园。在每个插槽中,都有一朵花。 N 天,N 朵花会一一绽放。每一天,都会有一朵花开,从那时起它就处于盛开的状态。

给定一个数组flowers,由1到N的数字组成。数组中的每个数字代表当天花开的地方。

例如,flowers[i] = x 表示在第 i 天开花的唯一花将在位置 x,其中 i 和 x 将在 1 到 N 的范围内。

同样给定一个整数K和M,你需要输出最近哪一天有M个长度至少为K的开花组处于开花状态。

【问题讨论】:

  • 您是否尝试过编写任何代码(或伪代码)?
  • 嗨@CertainPerformance,我确实使用二叉索引树编写了代码,但我被困在如何确定是否在组中间插入了一些花,那么我如何才能确定它是长度至少为 K 的连续群。如果花是在末尾或开头添加的,那么很容易我们只需要检查 i、i+k+1 或 i 到 i-k-1 中的个数。但是,如果那朵花出现在序列的中间并形成长度为 k 的序列呢?
  • @CertainPerformance 请为此提供一些指导。谢谢
  • 如果连续有K+1开花,算不算2组长度K
  • @user3386109 不,它只是一组。

标签: algorithm


【解决方案1】:

一种可能的方法

变换数组 花[i] = x 到花2[x]=i

现在可以从 day=1..N 开始迭代

如果flowers2[i]=K - O(n2) 解决方案计算你有多少个连续的组。

这可以通过意识到随着一天从 1 增长到 N 来优化到 O(nlong) ..groups 的大小将变得更大而数量更少。所以做一些像二进制搜索这样的事情。从天 = N/2 开始。假设最小组大小为 k,组数为 m。现在,如果 kM 选择天作为上限( N/2, N )的中间,否则选择下限( 0, N/2 )的中间。反复做,直到找到ans。这仅在答案始终存在时才有效

【讨论】:

  • 这是 O(N^2) 的方法,因为 N 有两个 for 循环。
  • 是的。我的意思是找到大小 >k 的组可以完成 O(n)
  • 但在此之前你在没有天数上进行迭代对吗?
  • 是的,我的意思是找到大小 > k 的组可以在 O(n) 中完成
  • 是的,我明白这一点,但我需要整体复杂度 O(nlogn) 而不是 O(n^2)。
猜你喜欢
  • 1970-01-01
  • 2022-08-21
  • 1970-01-01
  • 1970-01-01
  • 2022-10-02
  • 2017-01-24
  • 2011-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多