我最近在一次比赛中遇到了一个编码问题,我想不出解决这个问题的方法。(我退出了比赛:(
所以问题来了:考虑一个整数数组,其中每个元素可以通过两个操作进行修改。要么将元素除以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:
- 将低位和高位指针分配到数组的开头
- 我们将跟踪指针之间的子数组需要多少次移动才能实现奇偶校验0。将此子数组开销初始化为0
- 增加高指针。添加子数组中新元素的成本
- 而成本>k、 递增低指针并移除从子阵列移除的元素的成本
- 返回到3,直到高位指针退出数组。记住在这一步中看到的最长的子阵列
请注意,从0到奇偶校验1的代价是无限的。对于上述算法的目的,可以说它的成本为k+1。