簡體   English   中英

尋找最小的正數

[英]Finding the smallest positive 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;
    } 
};

在每次迭代中,您的 i 都在增加,因此您在 for 循環中編寫的這個條件:

arr[i]!=index

在這里,假設輸入數組有重復元素,那么對於i 2 個連續值,您將在 arr[i] 中獲得相同的值。 在第一次比較中,此條件將成立,因此您轉到 else 部分並增加index值。 在下一次迭代中,您的條件arr[i]!=index始終為真,因為 arr[i] 仍然相同,但索引增加了。 因此,您的程序將從 for 循環中斷,並返回索引值。 這就是它失敗的地方。

因此,只要輸入數組中有重復的正元素,它就會總是失敗。 除了數組中最大的項目是輸入中唯一重復的情況。

這是一個提示:

    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==3 arr[3]等於1 ,這是您要針對index評估的第一個數字。 但是, index將等於3 ,而不是1 ,你可能已經預期。

正如其他人指出的那樣 - 數組中的重復數字也不會被處理。

第二個提示:

如果我告訴你......有一種方法可以解決這個問題,而無需對輸入數組進行排序? 如果您分配了一個長度為 N 的 bool 數組來處理會怎樣....

如果arr[i] == index您應該只增加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;
}

您可以嘗試使用計數數組,然后遍歷該數組,直到找到一個空位。

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;
}

代碼如何工作:首先獲取元素計數並通過循環將所有項目添加到 Vector 中,第二個循環到 1000 我檢查從 1 到 1000,如果 1,2,3,4,... 中的任何一個不在我打印的向量中缺少,我使用 bool 變量 res 執行此操作,如果從 1 到 1000 的任何循環計數器在向量 res 變量中設置為 True,否則為 False。在從 1 到 1000 的 For 循環的每次運行中要小心,您應該設置 res=錯誤的

#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;
    }
        
    
}
    
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM