假设我有2个排序数组。其中一个具有要从另一个中删除的元素。 例如
int array1[]={1,2,3,4,5,6,7,8,9,10,11,12,13};
int delete[]={5,9,12};
如何从array1中删除delete数组中指示的元素,并有效地将其余部分移到array1中?
我不想遍历array1的所有元素,因为其中一些元素将保持不变。所以我想从
开始 int j,i=0,n=0;
for(j=delete[i+n];j<delete[i+1+n];j++){
array1[i-n]=array1[i+1-n];
n++;
}
但我无法弄清楚如何正确行事。有什么想法吗?
答案 0 :(得分:1)
从数组中删除任何元素是O(N)操作。您可以执行以下操作。
继续将array1 [j]复制到array1 [j - count]。
array1 [j - count] = array1 [j];
继续直到array1的结尾。最后,将array1的大小调整为size - count
。
答案 1 :(得分:0)
您没有指定语言。我将组合数组,使它们成为一组并再次对结果进行排序。
set combined_set = new Set(array1 + array2)
array = new Array(combined_set).sort()
答案 2 :(得分:0)
这可以通过array1[]
和delete[]
的两步扫描完成。
同时扫描这两个数组并记住array1[]
中delete[]
的值也显示在array1[]
中的位置。
根据您在第一步中获得的排名,对于delete[]
中的每个值,您应该知道从{{1}}删除值后的位置。然后只需复制到正确的位置。完成!
所有过程都可以在 O(n)。
中完成答案 3 :(得分:0)
假设这样的声明:
var
TgtArr : array of integer; // given- sorted array of elements to be modified
TgtArrLen : integer; // given- count of elements in TgtArr
DelArr : array of integer; // given- sorted list of elements to be deleted
DelArrLen : integer; // given- count of elements in DelArr
并声明这些工作变量:
var PutPtr, GetPtr, DelPtr : integer; // local to deletion operation
此片段将完成删除:
DelPtr := 0;
PutPtr := 0;
for GetPtr := 0 to TgtArrLen-1 do begin
if TgtArr[GetPtr]<>DelArr[DelPtr] then begin
TgtArr[PutPtr] := TgtArr[GetPtr];
PutPtr := PutPtr+1;
end;
if TgtArr[GetPtr]>=DelArr[DelPtr] then begin
DelPtr := DelPtr+1;
if DelPtr>=DelArrLen then break; // out of "for GetPtr" loop
end;
end;
TgtArrLen := PutPtr;
(这是Delphi Pascal,但你明白了。)
答案 4 :(得分:0)
如果您不想更改数据结构,我们可以简单地使用两个
二元搜索
搜索要删除的元素的下限和上限。例如 数组{1,1,2,2,3,3,3,4,5}和删除元素是3,所以我们有起始索引和结束索引是4和6。
下一步非常简单,只需折叠上述两个索引指定的段。
如果您希望获得更快的性能,我建议您使用二进制搜索树,或使用存储频率元素的数组。