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

找出给定序列中不出现的最小正整数

万俟浩
2023-03-14

我试图解决下面提供的Codness中的一个问题,

编写一个函数:

class Solution { public int solution(int[] A); }

给定一个由N个整数组成的数组A,返回A中不出现的最小正整数(大于0)。

例如,给定A=[1,3,6,4,1,2],函数应该返回5。

Given A = [1, 2, 3], the function should return 4.

Given A = [−1, −3], the function should return 1.

假定:

N是范围[1...100,000]内的整数;数组A的每个元素都是范围[−1,000,000..1,000,000]内的整数。

预期最坏情况时间复杂度为O(N);预计最坏情况下的空间复杂度为O(N)(不计算输入参数所需的存储)。

我写的解决方案下面给出了一个低性能,但是,我看不到错误。

public static int solution(int[] A) {

        Set<Integer> set = new TreeSet<>();

        for (int a : A) {
            set.add(a);
        }

        int N = set.size();

        int[] C = new int[N];

        int index = 0;

        for (int a : set) {
            C[index++] = a;
        }

        for (int i = 0; i < N; i++) {

            if (C[i] > 0 && C[i] <= N) {
                C[i] = 0;
            }
        }

        for (int i = 0; i < N; i++) {

            if (C[i] != 0) {
                return (i + 1);
            }
        }

        return (N + 1);
    }

这里提供了分数,

我会继续调查自己,但如果你能看得更清楚,请通知我。

共有3个答案

钱德海
2023-03-14

我的代码在Java,100%的结果在代码

import java.util.*;

class Solution {
    public int solution(int[] arr) {
        int smallestInt = 1;

        if (arr.length == 0) return smallestInt;

        Arrays.sort(arr);

        if (arr[0] > 1) return smallestInt;
        if (arr[arr.length - 1] <= 0) return smallestInt;

        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == smallestInt) {
                smallestInt++;
            }
        }

        return smallestInt;
    }
}
孟文栋
2023-03-14

100%的Javascript结果解决方案:

function solution(A) {
    // only positive values, sorted
    A = A.filter(x => x >= 1).sort((a, b) => a - b)

    let x = 1

    for(let i = 0; i < A.length; i++) {
        // if we find a smaller number no need to continue, cause the array is sorted
        if(x < A[i]) {
            return x
        }
        x = A[i] + 1
    }

    return x
}

魏凯捷
2023-03-14

如果预期的运行时间应该是线性的,则不能使用树集,它对输入进行排序,因此需要O(NlogN)。因此,您应该使用HashSet,这需要O(N)时间来添加N元素。

此外,你不需要4个循环。将所有正输入元素添加到HashSet(第一个循环)中,然后找到不在该集合中的第一个正整数(第二个循环)就足够了。

int N = A.length;
Set<Integer> set = new HashSet<>();
for (int a : A) {
    if (a > 0) {
        set.add(a);
    }
}
for (int i = 1; i <= N + 1; i++) {
    if (!set.contains(i)) {
        return i;
    }
}
 类似资料:
  • 我正在尝试以下练习来提高我的在线技能,我遇到了以下问题。 这是一个演示任务。 编写一个函数:class Solution{public int Solutions(int[]A);},给定一个包含N个整数的数组A,返回A中没有出现的最小正整数(大于0)。 举个例子, 给定 A = [1, 3, 6, 4, 1, 2],函数应返回 5。给定 A = [1, 2, 3],函数应返回 4。给定 A =

  • 我正在尝试解决一个leetcode类型问题,这是一个实践问题,它伴随着即将到来的代码测试,我需要为工作做一个,我遇到了麻烦。任何人都可以帮助我了解出了什么问题? 我基本上是在寻找暴力选项,因为我不知道algos/DS。 编写一个函数: 功能溶液(A); 给定一个包含 N 个整数的数组 A,返回 A 中未出现的最小正整数(大于 0)。 例如,给定A = [1,3,6,4,1,2],函数应该返回5。

  • 我在堆栈溢出上偶然发现了这个挑战,同时学习了使用 ScalaCheck 在 scala 中进行基于属性的测试。 求给定序列中不出现的最小正整数 我想尝试为这个问题编写一个基于生成器驱动属性的测试来检查我的程序的有效性,但似乎想不出如何编写相关的测试用例。我知道我可以为这个用例编写一个基于表驱动属性的测试,但这限制了我可以测试这个算法的属性数量。

  • 我只能想到一个朴素的算法,它列出集合的所有子集,并检查子集的和是否和是否最小,但它是一个指数算法,列出所有子集需要O(2^n)。我能用动态规划在多项式时间内求解吗?

  • 我有以下问题 写一个函数: 给定一个包含N个整数的数组A,返回A中没有出现的最小正整数(大于0)。 例如,给定 A = [1, 3, 6, 4, 1, 2],函数应返回 5。 给定A = [1,2,3],函数应该返回4。 给定A =[1,3],该函数应返回1。 为以下假设编写有效的算法: N是[1..100000]范围内的整数 数组A的每个元素都是范围内的整数[−1000000..1000000]

  • 给定一个由n个整数组成的数组nums和一个目标,求出满足nums[i]+nums[j]+nums[k] 例如,给定nums=[-2,0,1,3],target=2。 返回2。因为有两个和小于2的三胞胎: