给定一个大小为n的数组,包含0和1以及两次运算,找出使所有元素都为0的最小运算次数。
操作:
> < li>
如果第(I ^ 1)个元素为1,并且从第(I ^ 2)个到所有连续元素为0或不存在(如果I ^ 2 = n),则翻转第I个元素。(0
例如,上述操作适用于:
在这个元素上
|
V
1100年
或
在这个元素上
|
V
1011
n
例如,输入: 1,0,0,0
产量:15
解释:
1000 -
在除全为< code>0的数组之外的任何数组上,只有两种操作是可能的。翻转第n个元素,或者翻转数组中最后一个< code>1之前的元素。< br >我们不需要考虑仅第一个元素为< code>1的边缘情况,因为我们可以在数组的开头添加任意数量的零,这不会改变结果,即< code>[1,0,0,0]和< code>[0,1,0,0,0]需要相同数量的最小操作才能全部变为< code > 0。< br >这意味着在< code>0的每个序列上< br >这些观察的结果是,我们实际上有一个非常类似于二进制的数字系统,每个操作都可以看作是将一个数递增或递减1,这意味着对于每个< code>0和< code>1序列,都有一个等价的二进制数和十进制数,即该数与0之间的步数。< br >我已经找到了这个系统和二进制之间的关系,它是这样的:< br >如果我们从头到尾迭代数组,并翻转< code>1之后的每个元素,我们将得到等价的二进制。这个操作需要就地完成,这意味着我们在迭代时改变数组本身,并且每次迭代的结果都会影响下一次迭代。我没有证明为什么这是正确的,也许有人可以提供证明。
尽管如此,算法本身很简单。这是用python编写的:
a = [1, 0, 0, 0]
# convert to equivalent binary
for i in range(1, len(a)):
a[i] = int(not a[i]) if a[i-1] == 1 else a[i]
# convert to decimal
bin_str = ''.join(map(str, a))
print(int(bin_str, 2))
1.索引x处元素可以在一次移动中直接移动到x+1,x+2位置或x-1,x-2位置,之后移动计数将增加。 例如,在数组中,最小移动将为31: 索引4处的所有8个元素可以在总共16次移动中移动到索引0(因为所有8个元素都需要2次移动)。移动:16. 索引5中的3个元素可以在3步中移动到索引3(3个元素每步移动1步),索引5中剩余的5个元素可以在10步中移动到索引2(5个元素每步移动2步,所以总共移动1
这是一个面试问题。我们有一个大小为N的整数数组,包含0到N-1之间的元素。一个数字可能出现两次以上。目标是找到总和为给定数字X的对。 我使用了一个辅助数组,该数组包含主数组的元素计数,然后根据辅助数组重新排列主数组,以便对主数组进行排序,然后搜索对。 但是面试官想要空间复杂度常数,所以我告诉他对数组进行排序,但这不是时间复杂度解。他想要O(n)解。 是否有任何方法可以在没有任何额外空间的情况下在O
给定一组未排序的整数,返回大小为k的所有子集(即每组有k个唯一元素),其总和为0。 所以我给了面试官以下解决方案(我在GeekViewpoint上研究过)。没有使用额外的空间,一切都做到位,等等。但当然成本是O(n^k)的高时间复杂度,其中在解决方案中。 但随后她提出了以下要求: 必须在答案中使用hashmap以降低时间复杂度 必须绝对地为一般情况提供时间复杂度 k=6时的提示,O(n^3) 她对
给定任何自然数数组,例如:[2,1,2,3]查找数组是否可以转换为Max数组(打印-“是”)或如果不能(打印-“否”) 使其成为最大数组 - 将数组的每个元素转换为等于其最大元素。在上面的例子中,它将是[3,3,3,3],但是通过遵循这些规则 - 一次将任何两个元素增加1(正好是2个元素。不能一次增加一个或多个元素) 多次执行此操作,直到将每个元素转换为最大元素(如果可能,请打印“YES”,否则打
假设我们有一个数组 {7, 3, 7, 3, 1, 3, 4, 1}。我需要的是一个算法(最好是一些 C 代码示例),它将返回包含数组所有元素的最小子数组的长度。 在这种情况下,它将是 5:{7, 3, 1, 3, 4},这是原始数组的最短子数组,其中包含数组的所有元素,即 1、3、4 和 7。 此外,数组 {2, 1, 1, 3, 2, 1, 1, 3} 的另一个示例,算法应返回 3,因为我们正
相关主题: 卡达内算法