假设我们有两个数组A [n]和b [n],目标是将A中的每个元素与B中的元素进行比较。然后返回一个列表结果[n],该结果记录A中每个元素的数量,大于B中的元素。
例如
A = [38,24,43,3],B = [9,82,10,11]
由于38大于9、10和11,所以result [0]为3。 然后结果是[3,3,3,0]。
如果您可以提供一些伪代码,那将是最好的。
谢谢。
答案 0 :(得分:2)
您可以以O(nlogn)复杂度执行上述算法,其中n是问题中给出的数组A和数组B的长度。
1. Sort both the arrays A and B, this will take O(nlogn) time complexity.
2. Take two pointers i and j, initialize both of them to 0. we will use i for array A and j for B.
3. Create a result array res of size n.
4. Start a while loop
while(i<n && j<n) {
if(A[i] > B[j]) {
j++;
} else {
res[i] = j+1;
i++;
}
}
5. while(i<n) {
res[i] = n;
}
This step is for the case where all elements in A are bigger than all elements in B.
最后,您将准备好res
数组以及答案。
总体时间复杂度-O(nlogn)
。
希望这会有所帮助!
答案 1 :(得分:0)
这两个列表都需要按升序排序。
排序成本O(log n)。而且big-O算术意味着两次仍然O(n log n)
。我假设它们已经被排序。下面的其余工作不会影响big-O的成本。
具有一个名为B
的{{1}}数组的索引,值为零(我的伪代码将使用基于零的索引)。 indexB
的{{1}}也从零开始。
indexA
此后,A
之后的indexA=0
For each indexB from 0 to B.Length-1
While indexA < A.Length and the value at `A[indexA]` is less than or equal to the value at `B[indexB]`
Set the `result[indexA]` to be `indexB`
Increment `indexA`
Endwhile
Endfor
中的所有其余项目都比result
中的所有项目大,因此将其余项目设置为indexA