给定一个整数数组,找到线性时间和常量空间中第一个缺失的正整数

2024-01-05

换句话说,找到数组中不存在的最小正整数。该数组也可以包含重复项和负数。 这个问题是 Stripe 在编程采访中提出的。我设计了一个解决方案,如下所示:

#include<bits/stdc++.h>
using namespace std;

int main(){
    int arr[]={1,-1,-5,-3,3,4,2,8};
    int size= sizeof(arr)/sizeof(arr[0]);
    sort(arr, arr+size);
    int min=1;

    for(int i=0; i<size; i++){
        if(arr[i]>min) break;
        if(arr[i]==min) min=min+1;
    }
    cout<<min;
    return 0;
}

这里,我先对数组进行排序,然后遍历数组一次。在遍历数组之前,我将一个名为“min”的变量初始化为1。现在,在遍历数组时,当我们得到一个等于min的整数时,我们只需增加min的值即可。这确保了 min 变量保存尚未发生的最新最小正整数。 你能想到更好的方法吗?提前致谢。


假设数组可以修改,

  1. 我们将数组分为两部分,第一部分仅包含正数。假设我们的起始索引为0和结束索引为end(独家的)。

  2. 我们从索引开始遍历数组0 to end。我们取该索引处元素的绝对值 - 假设该值为x.

    1. If x > end我们什么也不做。
    2. 如果不是,我们对索引处的元素做符号x-1消极的。 (澄清:我们不切换标志。如果值为正,则变为负。如果为负数,则仍为负数。在伪代码中,这将类似于if (arr[x-1] > 0) arr[x-1] = -arr[x-1]并不是arr[x-1] = -arr[x-1].)
  3. 最后,我们从索引再次遍历数组0 to end。如果我们在某个索引处遇到正元素,我们输出index + 1。这就是答案。但是,如果我们没有遇到任何正元素,则意味着整数1 to end出现在数组中。我们输出end + 1.

也有可能所有数字都是非正数end = 0。输出end + 1 = 1仍然正确。

所有步骤都可以在O(n)时间和使用O(1) space.

Example:

Initial Array:            1 -1 -5 -3 3 4 2 8
Step 1 partition:         1 8 2 4 3 | -3 -5 -1, end = 5

在步骤 2 中,我们更改正数的符号以跟踪哪些整数已经出现。例如,这里array[2] = -2 < 0,这表明2 + 1 = 3数组中已经发生了。基本上,我们改变具有索引的元素的值i为负数,如果i+1是在数组中。

Step 2 Array changes to: -1 -8 -2 -4 3 | -3 -5 -1

在步骤 3 中,如果某个值array[index]是正数,这意味着我们没有找到任何整数值index + 1在步骤 2 中。

Step 3: Traversing from index 0 to end, we find array[4] = 3 > 0
        The answer is 4 + 1 = 5
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

给定一个整数数组,找到线性时间和常量空间中第一个缺失的正整数 的相关文章

  • 将字符串转换为字节数组时会发生什么

    我认为这是一个新手类型的问题 但我已经很理解了 我可以找到很多关于如何用各种语言将字符串转换为字节数组的帖子 我不明白的是逐个字符地发生了什么 据我所知 屏幕上显示的每个字符都由一个数字表示 例如它的 ascii 代码 我们现在可以坚持使用
  • 按共同关联的数量排序 (Rails)

    背景 我有帖子和用户 并且都有很多社区 客观的 对于任何给定的用户 我想返回一个帖子集合 按该帖子与该用户有共同社区的数量排序 具有更多共同社区的帖子位于更高的位置 我当前的尝试 使用排序方法 有效 Post includes commun
  • Python:并行修改数组的简单方法

    这个问题可能听起来很简单 但作为 Python 并行化的新手 我肯定会遇到困难 我处理了 OpenMP for C 中的并行化问题 这要容易得多 我需要做的是并行修改矩阵的条目 就是这样 问题是 我无法使用简单的 joblib 库来做到这一
  • 如何为 pg_trgm `'term' % ANY (array_column)` 查询索引字符串数组列?

    我尝试过普通的Postgresgin索引以及 pg trgmgin trgm ops and gist trgm ops索引 使用此解决方法 https stackoverflow com a 33016333 283398 https s
  • using 可用于为数组键入别名吗?

    我不确定我的措辞是否正确 因为这有点奇怪 基本上我发现了一些这样的代码 template
  • 将数组复制到动态分配的内存

    我的代码可以正常工作 但我觉得好像有一种更快的方法可以做到这一点 特别是在我的函数副本中 这是我的代码 这能再快一点吗 顺便说一句 这是 C 语言 另外 当我从函数返回 cpy 时 它是否会删除动态内存 因为它超出了范围 我不想发生内存泄漏
  • std::bind2nd 和 std::bind 与二维数组和结构数组

    我知道 C 有 lambda 并且 std bind1st std bind2nd 和 std bind 已弃用 然而 从C 的基础开始 我们可以更好地理解新特性 所以 我从这个非常简单的代码开始 使用int 数组s 第一个例子 与std
  • 在Python中将数组的元素从科学记数法转换为十进制记数法

    我有一个 numpy 数组 其元素采用科学格式 我想将它们转换为十进制格式 我的 numpy 数组如下所示 array 93495052 96955582 98555123 06146193 array 1 00097681e 09 9 9
  • RNG 技术的可移植性和可重复性

    我可以使用两种方法之一来创建一个伪随机数序列 该序列具有两个重要特征 1 它可以在不同的机器上重现 2 该序列永远不会重复范围内的数字 直到所有数字都被发出 我的问题是 这两种方法在可移植性 操作系统 Python 版本等 方面是否存在潜在
  • Python 中列表的线性合并

    我正在努力通过Google 的 Python 课堂练习 http code google com edu languages google python class index html 其中一个练习是这样的 给定两个按升序排序的列表 创建
  • 如何从列中创建对称矩阵?

    例如 我想转动以下列 90 175 600 650 655 660 代入矩阵 90 175 600 650 655 660 175 600 650 655 660 655 600 650 655 660 655 650 650 655 66
  • 插入排序 - 如何接受输入并打印排序后的数组

    我试图做一个插入排序程序 它接受任何数据类型 Int Double String 然后打印排序后的数组 我知道我的代码可以工作 但我无法找出真正的问题 import java util public class MyInsertionSor
  • Objects.deepToString(Object o) 方法

    班上java util Objects包含deepEquals Object a Object b 可用于比较任何类型的对象 包括数组和空引用 的方法 但不包含类似的方法deepToString Object o 这令人失望 顺便说一下 这
  • C 中的数组地址减法[重复]

    这个问题在这里已经有答案了 可能的重复 C 中的指针算术 https stackoverflow com questions 759663 pointer arithmetic in c Code int main int a 0 1 2
  • 将数组分配给数组

    所以我正在尝试一些数组 但我不明白为什么这不起作用 int numbers 5 1 2 3 int values 5 0 0 0 0 0 values numbers 出现以下错误 Error 1 error C2106 left oper
  • 找到将一个数字转换为另一个数字的最小移动次数的算法

    假设我们有两个正整数 a 和 b 每次移动我们都可以将 a 除以 2 但前提是 a 是偶数 将 a 乘以 2 或者将 a 加 1 将a变为b需要多少步 找到一个直接公式或一种有效的算法 即以对数时间运行的算法 我取得的一些进展 我们可以把它
  • 如何将一个数组中的所有项目复制到另一个数组中?

    如何将数组的每个元素 其中元素是对象 复制到另一个数组中 以便它们完全独立 我不想更改一个数组中的元素来影响另一个数组 这里的关键是 数组中的条目是对象 并且 您不希望对一个数组中的对象的修改显示在另一个数组中 这意味着我们不仅需要将对象复
  • 按升序对 NSDictionary 进行排序

    我正在尝试排序NSDictionary按升序排列 我正在使用这段代码 NSDictionary valDict self mGetDataDict key rowKey for NSString valueKey in valDict al
  • 如何在 C# 中使用键对 NameValueCollection 进行排序?

    我编写了以下代码 它也有效 但我想知道它们是否比这更好 NameValueCollection optionInfoList if aSorting optionInfoListSorted new nameValueCollection
  • 如何缩短 PHP if 语句?

    我有一个 if 语句 我需要将单个字符串与许多不同的选项进行比较 我在下面发布的代码非常清楚地表明了我的意思 我知道有两种方法可以做到这一点 但另一种甚至更长 那么 是否有任何函数可以以更短的方式实现类似的功能 我的要求可能看起来很愚蠢 但

随机推荐