专门做奢侈品的网站,修改wordpress 2m,腾讯企点app,网站建设代码怎么写LeetCode 88. 合并两个有序数组
题目描述
给你两个有序整数数组 nums1 和 nums2#xff0c;请你将 nums2 合并到 nums1 中#xff0c;使 nums1 成为一个有序数组。
说明:
初始化 nums1 和 nums2 的元素数量分别为 m 和 n。你可以假设 nums1 的大小等于 m n#xff08;即…LeetCode 88. 合并两个有序数组
题目描述
给你两个有序整数数组 nums1 和 nums2请你将 nums2 合并到 nums1 中使 nums1 成为一个有序数组。
说明:
初始化 nums1 和 nums2 的元素数量分别为 m 和 n。你可以假设 nums1 的大小等于 m n即它有足够的空间存放 nums2 中的元素。
示例:
输入:
nums1 [1,2,3,0,0,0], m 3
nums2 [2,5,6], n 3
输出: [1,2,2,3,5,6]Java 实现解法
方法一双指针从后向前合并
class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int p1 m - 1; // nums1的当前索引int p2 n - 1; // nums2的当前索引int p m n - 1; // nums1的末尾索引while (p1 0 p2 0) {if (nums1[p1] nums2[p2]) {nums1[p--] nums1[p1--];} else {nums1[p--] nums2[p2--];}}// 如果nums2还有剩余直接拷贝到nums1前面while (p2 0) {nums1[p--] nums2[p2--];}}
}解题思路
双指针从后向前合并由于题目要求将 nums2 合并到 nums1 中并且 nums1 的空间足够大因此我们可以使用双指针法从后向前合并这两个数组。这样做的好处是可以避免在合并过程中对 nums1 的覆盖从而丢失尚未处理的数据。在合并过程中我们比较 nums1 和 nums2 的当前元素将较大的元素放入 nums1 的末尾并更新指针和末尾索引 p。如果 nums2 中还有剩余元素说明 nums1 中的元素已经全部处理完毕此时我们可以直接将 nums2 的剩余元素拷贝到 nums1 的前面。
这种方法的时间复杂度是 O(mn)其中 m 和 n 分别是 nums1 和 nums2 的长度因为每个元素我们至多处理一次。空间复杂度是 O(1)因为我们是在原地修改 nums1。
注来源leetcode网站