描述 给两个按 非递减顺序 排列的整数数组 arr1 和 arr2 ,另有两个整数 len1 和 len2 ,分别表示 arr1 和 arr2 中的元素数目。 请合并 arr2 到 arr1 中,使合并后的数组同样按 非递减顺序 排列。 - 注意:最终,合并后数组不应由函数返回,而是存储在数组 arr1 中。为了应对这种情况,arr2 的初始长度为 len1 + len2,其中前 len1 个 元素表示应合并的元素,后 len2 个元素为 0 ,应忽略。 arr2 的长度为 len2 。 提示: arr1.length == len1 + len2 arr2.length == len2 0 <= len1, len2 <= 100 1 <= len1 + len2 <= 200 0 <= arr1[i], arr2[j] <= 9 输入描述 示例1: 输入arr1 = [1,2,3], len1 = 3, arr2 = [2,5,6], len2 = 3 手动输入时需要通过 “#”进行隔离,示例1的输入方法为 123#256#; 示例2: 输入:arr1 = [1], len1 = 1, arr2 = [], len2 = 0 手动输入时需要通过 “#”进行隔离,示例2的输入方法为 1##; 示例 3: 输入:arr1 = [0], len1 = 0, arr2 = [1], len2 = 1 注意,因为 len1 = 0 ,所以 arr1 中没有元素。arr1 中仅存的 0 仅仅是为了确保合并结果可以顺利存放到 arr1 中。 手动输入时需要通过 “#”进行隔离,示例1的输入方法为 #1# 输出描述 示例1的输出结果为:122356 示例2的输出结果为:1 示例3的输出结果为:1
时间: 2024-03-08 16:46:22 浏览: 89
这是一道合并两个有序数组的问题,可以使用双指针的方法。具体思路如下:
设两个指针 i 和 j 分别指向 arr1 和 arr2 的末尾,即 i = len1 - 1,j = len2 - 1。再设一个指针 k 指向 arr1 的末尾,即 k = len1 + len2 - 1。
比较 arr1[i] 和 arr2[j] 的大小,将较大的元素复制到 arr1[k] 中,同时将指针 k 向前移动一位,被复制的元素所在数组的指针向前移动一位。重复上述步骤直到其中一个指针到达数组的开头。
如果 arr2 中还有元素未复制,则将这些元素复制到 arr1 中。
最后 arr1 中的元素就是合并后的有序数组。
以下是 Python 代码实现:
```python
def merge(arr1, len1, arr2, len2):
i, j, k = len1 - 1, len2 - 1, len1 + len2 - 1
while i >= 0 and j >= 0:
if arr1[i] > arr2[j]:
arr1[k] = arr1[i]
i -= 1
else:
arr1[k] = arr2[j]
j -= 1
k -= 1
while j >= 0:
arr1[k] = arr2[j]
j -= 1
k -= 1
return arr1
```
对于示例输入 arr1 = [1,2,3], len1 = 3, arr2 = [2,5,6], len2 = 3,输出结果为 1 2 2 3 5 6。
对于示例输入 arr1 = [1], len1 = 1, arr2 = [], len2 = 0,输出结果为 1。
对于示例输入 arr1 = [0], len1 = 0, arr2 = [1], len2 = 1,输出结果为 1。
阅读全文