[英]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.