📅  最后修改于: 2023-12-03 15:39:09.613000             🧑  作者: Mango
如果你需要计算一个数组中小于或等于另一个数组中的每个元素的个数,你可以使用以下代码实现。
def count_smaller_numbers(nums1, nums2):
result = []
for num1 in nums1:
count = 0
for num2 in nums2:
if num1 >= num2:
count += 1
result.append(count)
return result
function countSmallerNumbers(nums1, nums2) {
const result = [];
for (const num1 of nums1) {
let count = 0;
for (const num2 of nums2) {
if (num1 >= num2) {
count++;
}
}
result.push(count);
}
return result;
}
assert count_smaller_numbers([5, 2, 6, 1], [6, 5, 4, 3]) == [2, 1, 3, 0]
assert count_smaller_numbers([1, 2, 3, 4], [4, 3, 2, 1]) == [4, 3, 2, 1]
assert count_smaller_numbers([1, 2, 3, 4], [5, 6, 7, 8]) == [0, 0, 0, 0]
这段代码的时间复杂度是 $O(n^2)$,其中 $n$ 是两个数组中元素的个数。
这段代码的空间复杂度是 $O(n)$,其中 $n$ 是第一个数组中元素的个数。
上述算法的时间复杂度是 $O(n^2)$,在 $n$ 很大的情况下,算法表现会很差。因此,我们需要一种更优的算法来提高效率。
我们可以先将第二个数组排序,然后使用二分查找法来查找相应的元素。下面是修改后的 Python 代码示例。
def count_smaller_numbers(nums1, nums2):
nums2_sorted = sorted(nums2)
result = []
for num1 in nums1:
left = 0
right = len(nums2_sorted) - 1
while left <= right:
mid = (left + right) // 2
if nums2_sorted[mid] <= num1:
left = mid + 1
else:
right = mid - 1
result.append(left)
return result
JavaScript代码示例:
function countSmallerNumbers(nums1, nums2) {
const nums2Sorted = nums2.sort((a, b) => a - b);
const result = [];
for (const num1 of nums1) {
let left = 0;
let right = nums2Sorted.length - 1;
while (left <= right) {
const mid = Math.floor((left + right) / 2);
if (nums2Sorted[mid] <= num1) {
left = mid + 1;
} else {
right = mid - 1;
}
}
result.push(left);
}
return result;
}
这段代码的时间复杂度是 $O(n\log n)$,其中 $n$ 是两个数组中元素的个数。
这段代码的空间复杂度是 $O(n)$,其中 $n$ 是第一个数组中元素的个数。