当前位置: 首页 > 知识库问答 >
问题:

给定未排序的整数数组,查找不可搜索的数字

邵兴文
2023-03-14

朋友的面试问题

给定一个未排序的整数数组,使用二进制搜索无法找到多少个数字?

例如,[2, 3, 4, 1, 5],只有数字1不能使用二分查找,因此Count=1

[4,2,1,3,5]4以及4和2不可搜索=

预期运行时间为O(n)

想不出能实现O(n)时间的算法:(

然而,考虑构建最小和最大arr时,子阵列可能会再次出错,因此无法工作。

显然,我们已经知道O(nlogn)方法,只需对每个数字调用二进制搜索并进行检查。

共有3个答案

佘飞鸣
2023-03-14

想法:这个问题可以改写为——找出数组中大于左边所有数字、小于右边所有数字的数字的计数。进一步简化后,找出左侧大于最大数且右侧小于最小数的数的计数。

代码:Java 11 |时间/空间:O(n)/O(n)

int binarySearchable(int[] nums) {
    var n = nums.length;
   
    var maxToLeft = new int[n + 1];
    maxToLeft[0] = Integer.MIN_VALUE;
   
    var minToRight = new int[n + 1];
    minToRight[n] = Integer.MAX_VALUE;
   
    for (var i = 1; i < n + 1; i++) {
        maxToLeft[i] = Math.max(maxToLeft[i - 1], nums[i - 1]);
        minToRight[n - i] = Math.min(minToRight[n  + 1 - i], nums[n - i]);
    }

    for (var i = 0; i < n; i++)
        if (nums[i] >= maxToLeft[i + 1] && nums[i] <= minToRight[i + 1])
            count++;
    return count;
}
  • TopCoder问题:https://community.topcoder.com/stat?c=problem_statement
柴声
2023-03-14

尝试创建以下函数:

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)中运行的方式实现此功能。它比朴素方法更快的原因是,在每个范围内只进行一次递归调用,而不是在该范围内的每个元素进行一次递归调用。

申屠黎昕
2023-03-14

我相信这个代码工作正常。它对列表中的每个值进行一次遍历,所以它是O(n)。

function CountUnsearchable(list, minValue = -Infinity, maxValue=Infinity) {
  if (list is empty) return 0;
  let midPoint = mid point of "list"
  let lowerCount = CountUnsearchable(left half of list, minValue, min(midPoint, maxValue));
  let upperCount = CountUnsearchable(right half of list, max(minValue, midPoint), maxValue);
  let midPointUnsearchable = 1 if midPoint less than minValue or greater than maxValue, otherwise 0;
  return lowerCount + upperCount + midPointUnsearchable;
}

它是有效的,因为我们在树上行走有点像在二元搜索中,除了在每个节点上我们都走这两条路径,并简单地跟踪可能导致我们走这条路径的最大值,以及可能导致我们走这条路径的最小值。这使得查看当前值并回答是否可以通过二进制搜索找到的问题变得简单。

 类似资料:
  • 求一个未排序数组的中值,我们可以对n个元素做O(nlogn)时间的min-heap,然后我们可以逐个抽取n/2个元素得到中值。但是这种方法需要O(nlogn)时间。 我们能在O(n)时间内通过某种方法做同样的事情吗?如果可以,那么请告诉或建议一些方法。

  • 经典的问题陈述是:给定一个未排序的整数数组,找到中不存在的最小正整数。 在一个经典的问题陈述中,你只得到一个数组,你可以在这里、这里和这里找到很多关于这个问题的解决方案和资源。 在我的问题中,你得到了两个数组,和,长度均为。构造一个长度为 的数组 ,其“最小缺失整数”是可能的最大值。 必须是 或 。 我们如何以< code>O(N)的最坏情况时间和空间复杂度解决这个问题? 假设:

  • 本文向大家介绍PowerShell查找数组内容、搜索数组、查询数组的方法,包括了PowerShell查找数组内容、搜索数组、查询数组的方法的使用技巧和注意事项,需要的朋友参考一下 PowerShell中有-contain、-like、-in等操作符,使用这些操作符,可以很方便的在数组中查找元素内容。其中in操作符貌似要在PowerShell 3.0中才有。 先看一个例子,将Windows目录的所有

  • 本文向大家介绍PHP程序查找给定数组中缺少的数字,包括了PHP程序查找给定数组中缺少的数字的使用技巧和注意事项,需要的朋友参考一下 要查找给定数组中缺失的数字,代码如下 示例 输出结果 定义了一个名为“ missing_nums”的函数,该函数检查连续数字数组中是否缺少数字。 它遍历数组并检查以查看计数和要遍历的current_num。 如果在前一个数字加1时找不到两个值,则认为该值缺失。 在函数

  • 因此,我试图实现二分搜索算法(尽可能通用,以适应不同的情况)。我在网上搜索了一下,有的使用,有的使用等不同的条件,很让人困惑。 因此,我开始编写代码,查找第一个大于给定元素的元素。我想知道有没有比这更优雅的解决方案? 主代码: 类似地,为了找到比给定元素小的第一个元素, 当我不得不为这样的抽象修改二分搜索时,我经常会感到超级困惑。请让我知道是否有更简单的方法相同?谢谢!