摘要:
有一个无序整数数组,其中每个数都不相同,且每个数的取值范围为[1,N]。 设计一个时间复杂度为O(N)的算法,找出满足下面两个条件的数对的个数:1) 相邻两个数的和也在这在这个数组之中;2) 这两个数本身也相邻。答: 这个数组中的数有几个特征:(1) 每个都不相同;(2) 取值范围为[1,N], 完全满足计数排序的要求。不过这里不是要排序,但是可以用相同的思想: 用一个位数组,第i位为1表示数i在数组中, 第i位为0表示数i不在数组中。这样第一个条件的验证就很简单了,只要看一个相邻两个数的和对应位是否为1即可。 下面是C++实现:#include <bitset>#include 阅读全文
摘要:
有10瓶药丸,可以认为每一瓶的药丸有无限有颗。这其中有9瓶是好的,一瓶是坏的。坏药丸比好药丸重1g,现给你一杆称,问:1) 最多称几次可以确定那一瓶中装的是坏药丸?2) 如果事件不知道有几瓶中装的是坏的,又要称多少次可以确定哪些瓶中装的是坏的?答: 1) 1 次。 用 H(i) = 1 表示第i瓶中装的是坏药丸,H(i) = 0 表求第i瓶中装的是好药丸。从第i瓶中取出i粒药丸,则这些药丸一共重了: H(1) * 1 + H(2) * 2 + ... + H(10) * 10 = H(k) * k ( 1 <= k <= 10); 因为H(i) ( 1 <= i < = 阅读全文