这是我的程序,但由于不完整而无效。
using namespace std;
int main(){
int a[]={101,102,103,104,107,110};
int n = sizeof(a) / sizeof(int);
int b[]={102,103,101};
int m = sizeof(b) / sizeof(int);
int c[20];
static int k=0;
int flag;
for(int j=0;j<m;j++)
{
if(a[0]!=b[j])
{
c[k]=b[j];
printf("c[%d]=%d\n",k,c[k]);
k++;
}
}
return 0;
}
我需要找到包含未售出商品的C数组。
注意:不应使用排序。
我试了几个小时试图找到解决方案,但我无法想出任何简单的事情。如果有人帮忙会很棒。
答案 0 :(得分:1)
编辑:接受的答案效果很好,但会在二次时间内执行=&gt; O(n ^ 2)将比这个解决方案慢。
您是否考虑过使用pigeonhole principle?它适用于计算像你这样的问题。
如果将n个项目放入m个容器中,则n> m,那么至少一个容器必须包含多个项目。
在您的情况下,将数组“a”中的所有项放入容器(数组)中,索引对应于a中的实际数字(使用for循环。操作是=&gt; O(n))。浏览容器数组并标记包含b中项目的所有位置。操作也将是O(n)。最后,第三次浏览容器数组并选择所有未售出的项目。
这是代码(我没有测试它,但我认为它应该运行良好):
#include <iostream>
using namespace std;
int main(){
int a[]={101,102,103,104,107,110};
int n = sizeof(a) / sizeof(int);
int b[]={102,103,101};
int m = sizeof(b) / sizeof(int);
int c[20];
static int k=0;
int flag;
int largestNumInA = 0;
for(int i=0;i<n;i++){
if(largestNumInA < a[i])
largestNumInA = a[i];
}
int solutionSet[largestNumInA]; // this is our container
for(int j=0;j<n;j++){ // Time Complexity => O(n)
solutionSet[a[j]] = 1; // flag off the original sample items as 1..
}
for(int k=0;k<m;k++){ // Time Complexity => O(n)
solutionSet[b[k]] = -1; // flag off the sold items as -1..
}
for(int x=0;x<largestNumInA;x++){ // Time Complexity => O(n)
if(solutionSet[x] == 1){ // unsold items...
c[k] = x;
printf("c[%d]=%d\n",k,x);
k++;
}
}
return 0;
}
答案 1 :(得分:0)
我想你想找到这个:
#include <iostream>
using namespace std;
int main(){
int a[]={101,102,103,104,107,110};
int n = sizeof(a) / sizeof(int);
int b[]={102,103,101};
int m = sizeof(b) / sizeof(int);
int c[20];
static int k=0;
int flag;
for(int i =0;i<n;i++){
int f=0;
for(int j=0;j<m;j++)
{
if(a[i]==b[j])
{
f=1;
}
}
if(f==0)
{
c[k]=a[i];
printf("c[%d]=%d\n",k,c[k]);
k++;
}
}
return 0;
}
<强>输出强>
c[0]=104
c[1]=107
c[2]=110