我想写一个函数,它接受两个数组作为参数-
一个数组是源数组,另一个数组是索引数组。
我想从第二个数组中获取索引,并删除源数组中这些索引所对应的元素。
例如,第一个数组是:{12,5,10,7,4,1,9},索引数组是:{2,3,5}。
那么第一个数组中索引为2、3、5的元素,即10、7和1将被删除。
因此,第一个数组变为:{12,5,4,9}。
如果索引数组已排序,则我的O(N)解决方案如下:
#include<iostream>
using namespace std;
int main()
{
int arr[]={12,5,10,7,4,1,9},n=7,indices[]={2,3,5},m=3;
int j=0,k=0;
for(int i=0;i<n,k<m;i++)
{
if(i!=indices[k])
arr[j++]=arr[i];
else
k++;
}
for(i=0; i<j; i++)
cout<<arr[i]<<" ";
return 0;
}
如果索引数组未排序,如何以O(n)的时间复杂度解决呢?
O(n+m*lgm)
。O(n+m*lgm) < O(n+m*n) = O(n*m)
- johnchen902arr
中永远不会出现,但是可以由int
表示? - johnchen902O(n)
的时间复杂度,那么只需要使用非比较的O(n)
排序算法对索引进行排序即可。 - JoeGfor(int i=0; i<n, k<m; i++)
等同于for(int i=0; k<m; i++)
。 - Elliott