朋友的面试问题
给定一个未排序的整数数组,使用二进制搜索无法找到多少个数字?
例如[2、3、4、1、5],使用二进制搜索无法找到数字1,因此count = 1
[4,2,1,3,5] 4和4和2不可搜索=> binarySearch(arr,n)返回一个不等于num的数字
预期运行时间为O(n)
想不出可以达到O(n)时间的算法:(
关于构建最小和最大arr的想法,但是将无法正常工作,因为子数组会再次将其弄乱。
很明显,已经知道了O(nlogn)方法,只需对每个数字调用二进制搜索并检查。
答案 0 :(得分:2)
我相信这段代码可以正常工作。它对列表中的每个值进行一次遍历,因此为O(n)。
HashMap<Character, Integer> chars = new HashMap<>();
for(int i = 0; i < characters.length; i++){
if(chars.get(characters[i]) == null){
chars.put(characters[i], 1);
} else {
int num = chars.get(characters[i]);
chars.put(characters[i], num+1);
}
}
for(Character c : chars.keyset()){
print(c + " :" + chars.get(c));
}
之所以有效,是因为我们像在二叉搜索中一样走树,除了在每个节点处都走两条路径,并简单地跟踪可能导致我们走这条路径的最大值和最小值那可能导致我们走这条路。这使得它简单的看一下目前的价值,并回答它是否能够通过二进制搜索找到的问题。
答案 1 :(得分:0)
尝试创建以下功能:
def count_unsearchable(some_list, min_index=None, max_index=None, min_value=None, max_value=None):
"""How many elements of some_list are not searchable in the
range from min_index to max_index, assuming that by the time
we arrive our values are known to be in the range from
min_value to max_value. In all cases None means unbounded."""
pass #implementation TBD
可以按时间O(n)
运行的方式实现此功能。之所以比天真的方法快,是因为您只对每个范围进行一次递归调用,而不是对该范围内的每个元素进行一次递归调用。
答案 2 :(得分:0)
想法: 问题可以改写为 - 找到数组中大于其左侧所有数字且小于其右侧所有数字的数字的计数。进一步简化,找出左边大于最大数且小于右边最小数的数。
代码: Java 11 |时间/空间:O(n)/O(n)
$rating = floatval($imdb->getRating());
switch (true) {
case in_array($rating, range(1, 4.9, 0.1)):
$return['movie_rating'] = 1;
break;
case in_array($rating, range(5, 5.9, 0.1)):
$return['movie_rating'] = 2;
break;
case in_array($rating, range(6, 6.9, 0.1)):
$return['movie_rating'] = 3;
break;
case in_array($rating, range(7, 7.9, 0.1)):
$return['movie_rating'] = 4;
break;
case in_array($rating, range(8, 10, 0.1)):
$return['movie_rating'] = 5;
break;
default:
$return['movie_rating'] = 'n/A';
}