问题: 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;
}
};
答案 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==3
。 arr[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;
}
}
}