寻找最小的正数

时间:2021-07-04 04:18:10

标签: c++

问题: Smallest Positive missing number

这段代码有什么问题?

class Solution
{
    public:
    //Function to find the smallest positive number missing from the array.
    int missingNumber(int arr[], int n) 
    { 
        // Your code here
        sort(arr,arr+n);
        int index=1;
        int a;
        for(int i=0;i<n;i++){
            if(arr[i]>0){
                if(arr[i]!=index){
                    a=index;
                    break;
                }
                else{
                    index++;
                }
            }
        }
        return index;
    } 
};

5 个答案:

答案 0 :(得分:1)

在每次迭代中,您的 i 都在增加,因此您在 for 循环中编写的这个条件:

arr[i]!=index

这里,假设输入数组有重复元素,那么对于 i 的 2 个连续值,您将在 arr[i] 中获得相同的值。在第一次比较中,此条件为假,因此您转到 else 部分并增加 index 值。在下一次迭代中,您的条件 arr[i]!=index 始终为真,因为 arr[i] 仍然相同,但索引增加了。因此,您的程序将从 for 循环中断,并返回索引值。这就是它失败的地方。

因此,只要您的输入数组中有重复的正元素,它就会始终失败。除非数组中最大的项是输入中唯一的重复项。

答案 1 :(得分:1)

这里有一个提示:

    for(int i=0;i<n;i++){
        if(arr[i]>0){
            if(arr[i]!=index){
                a=index;
                break;
            }
            else{
                index++;
            }
        }
    }

假设你的排序数组是 [-10, -5, 0, 1, 2, 3, 4, 5]

i==3arr[3] 等于 1,这是您要针对 index 计算的第一个数字。但是 index 将等于 3,而不是您预期的 1

正如其他人指出的那样 - 数组中的重复数字也不会被处理。

第二个提示:

如果我告诉你......有一种方法可以解决这个问题,而无需对输入数组进行排序?如果你分配了一个长度为 N 的布尔数组来处理......

答案 2 :(得分:1)

如果index,您应该只增加arr[i] == index,否则对于重复的数组,例如{1,2,3,4,5,5,6,7},您将得到错误的结果。

int missingNumber(int arr[], int n) { 
    std::sort(arr,arr + n);

    int index=1;
    int a;
    for(int i=0; i < n; i++) { 
        if(arr[i] > 0) {
            if(arr[i] == index) {       // equal, step
                ++index;
            } else if(arr[i] > index) { // greater, we found the missing one
                a=index;
                break;
            }                           // else, arr[i] == index - 1, don't step
        }
    }
    return index;
}

不过,您错过了使用排序数组的绝佳机会。由于您只对正数感兴趣,因此您可以使用 std::upper_bound 来查找第一个正数。这种搜索非常有效,这也意味着您不必在循环的每次迭代中检查 if(arr[i] > 0)

示例:

int missingNumber(int arr[], int n) { 
    int* end = arr + n;

    std::sort(arr, end);        
    int* it = std::upper_bound(arr, end, 0); // find the first number greater than 0

    int expected = 1;
    
    while(it != end && *it <= expected) {
        if(*it == expected) ++expected;
        ++it;
    }
    
    return expected;
}

或者,std::partition 数组甚至在排序之前将正数放在数组中。这意味着您不会浪费时间对非正数进行排序。

int missingNumber(int arr[], int n) { 
    int* end = arr + n;

    end = std::partition(arr, end, [](int x){ return x > 0; });
    std::sort(arr, end);        

    int expected = 1;
    
    for(int* it = arr; it != end && *it <= expected; ++it) {
        if(*it == expected) ++expected;
    }

    return expected;
}

答案 3 :(得分:0)

您可以尝试使用计数数组,然后遍历数组,直到找到一个空位。

int main() {
    int N;
    cin >> N;
    int num; // set to zero b/c zero is out lowest possible number
    vector<int> numbers;
    while (cin >> num) {
        numbers.push_back(num); 
    }

   //create a counting array to add a 1 to all the positions that exist
    int * cA = new int[10000] {0};
    
    for (int i = 0; i < N; i++) {
        if (numbers[i] >= 0) {
            cA[numbers[i]]++;
        }
    }
    
    for (int i = 1; i < 10000; i++) {
        if (cA[i] == 0) {
            num = i;
            break;
        }
    }
    cout << num;
    
    delete []cA;
    
    return 0;
}

答案 4 :(得分:0)

代码的工作原理:首先获取元素计数并将所有项目按循环添加到 Vector 中,第二个循环到 1000 我检查从 1 到 1000,如果 1,2,3,4,... 中的任何一个是不在我打印丢失的向量中,我使用 bool 变量 res 执行此操作,如果从 1 到 1000 的任何循环计数器在向量 res 变量中,则将向量 res 变量设置为 True 否则为 False。在从 1 到 For 循环的每次运行中要小心1000 你应该设置 res=False

#include <iostream>
#include <vector>
using namespace std;
//Programmer : Salar Ashgi
int main()
{
    vector<int> v;
    int k=0;
    cout<<"Enter array count ?\n";
    cin>>k;
    int n;
    for(int i=0;i<k;i++)
    {
        cout<<"Enter num "<<i+1<<" : ";
        cin>>n;
        v.push_back(n);
    }
bool res=false;
for(int i=1;i<=1000;i++)
{
    res=false;
    for(int j=0;j<k;j++)
    {
        if(v[j]==i)
        {
            res=true;
            break;
        }
        
    }
    if(!res)
    {
        cout<<i<<" is missing !";
        break;
    }
        
    
}
    
}
相关问题