经过k次或更少运算后奇偶性相等的最长子阵列



我最近在一次比赛中遇到了一个编码问题,我想不出解决这个问题的方法。(我退出了比赛:(

所以问题来了:考虑一个整数数组,其中每个元素可以通过两个操作进行修改。要么将元素除以2,要么将元素乘以2。

给定通过上述操作修改阵列元素的k次机会(每次修改元素都被视为一次操作(,找出最大长度的连续子阵列,使得子阵列中的所有元素都具有相同的奇偶校验。

奇偶校验-当一个数字除以2 时的余数

例如:-考虑一个数组12,11,10,4和k=1这里元素的奇偶性是0,1,0,0。在将第二个元素11乘以2(因此完成一个运算(时,我们可以获得0的奇偶校验(由于22留下余数0(,因此给定k=1运算,具有相同奇偶校验的元素的连续子阵列的最大长度为4

如果将其划分为两个子问题,这是最简单的:用<=k移动,并且找到奇偶校验为1且<=k移动。然后选择较长的答案。

这两个子问题都可以用双指针方法很容易地解决。对于奇偶校验0:

  1. 将低位和高位指针分配到数组的开头
  2. 我们将跟踪指针之间的子数组需要多少次移动才能实现奇偶校验0。将此子数组开销初始化为0
  3. 增加高指针。添加子数组中新元素的成本
  4. 而成本>k、 递增低指针并移除从子阵列移除的元素的成本
  5. 返回到3,直到高位指针退出数组。记住在这一步中看到的最长的子阵列

请注意,从0到奇偶校验1的代价是无限的。对于上述算法的目的,可以说它的成本为k+1。

最新更新