📌  相关文章
📜  对于第一个数组中的每个元素,计算第二个数组中小于或等于它的元素 | 2套(1)

📅  最后修改于: 2023-12-03 15:39:09.613000             🧑  作者: Mango

计算一个数组中小于或等于另一个数组中的每个元素

如果你需要计算一个数组中小于或等于另一个数组中的每个元素的个数,你可以使用以下代码实现。

Python代码示例
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
JavaScript代码示例
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$ 是第一个数组中元素的个数。