如果利用双重循环,将每个值依次与其后面的值相比较,有相同的则删除该元素。那么在删除元素的时候又需要一个for循环,这样一共有三个for循环时间复杂度就不是n平方了吧?
求思路!!!
这是一个空间换时间的题目 考研408 里面出过,,,首先得到顺序表的最大值,正常题目告诉你了,然后构造一个跟最大值一样大的数组,然后将每个数的值依次对应到数组中,有重复元素的删除即可。仅提供思路。
1楼的思路:
int j=0;
sor(a,a+n);
b[j++] = a[0];
for(int i=1;i<n;++i)
if(a[i] != a[i-1])
b[j++] = a[i];
最后的出来的b数组就是剔除了a数组中重复元素的数组,时间大概是logn^2。
2楼的思路:
bool nums[N]; // N为输入的数据中可能的最大的数
memset(nums,false,sizeof(nums));
for(int i=0;i<n;++i)
nums[a[i]] = true;
int b[MAX]; // MAX为输入数据量
for(int i=0;i<n;++i){
if(nums[a[i]]){
b[j++] = a[i];
nums[a[i]] = false;
}
这样用n级别的时间也可以得出,不过如果数据是浮点的或者数据过大的话,这样的方法不一定可取。
个人思路:
看了两遍数组b了,楼主你先在明白如何用两个循环来删除元素了吗?
int k=0;
for(int i=0;i<n;++i){
int flag = true;
for(int j=0;j<k;++j)
if(a[i] == b[j])
flag = false;
if(flag) b[k++] = a[i];
}
这样大概是n^2(貌似比n^2小)。
或者这样:
int b[N];
bool fa[N]; // 此处N大小与数组a的大小一致
for(int i=0;i<n;++i)
for(int j=i;j<n;++j)
if(a[i] == a[j])
fa[j] = false;
int k=0;
for(int i=0;i<n;++i)
if(fa[i]) b[k++] = a[i];
嘛,思路大同小异,这样大概是也是n^2。
最后求不采纳,因为没有什么原创内容。。。祝各位新年大吉。
可不可以先排序,然后不就好了!
http://www.zybang.com/question/5d08ba08789f364a9eabd026705c2e7e.html