您的位置:首页 > 健康 > 养生 > 用户服务管理系统_医院网站建设要求_最新热点新闻事件素材_南宁seo排名收费

用户服务管理系统_医院网站建设要求_最新热点新闻事件素材_南宁seo排名收费

2025/4/19 13:14:12 来源:https://blog.csdn.net/FRF65/article/details/142938377  浏览:    关键词:用户服务管理系统_医院网站建设要求_最新热点新闻事件素材_南宁seo排名收费
用户服务管理系统_医院网站建设要求_最新热点新闻事件素材_南宁seo排名收费

题目描述

给定两个有序整数数组 nums1 和 nums2,其中 nums1 的长度为 m,nums2 的长度为 n。假设 nums1 的大小等于 m + n(即 nums1 有足够的空间存放 nums2 的元素)。你需要将 nums2 合并到 nums1 中,使合并后的数组仍然有序。

示例

示例 1

输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6],       n = 3
输出: [1,2,2,3,5,6]
解释: 合并后的数组已按非递减顺序排序。

示例 2

输入:
nums1 = [4,5,6,0,0,0], m = 3
nums2 = [1,2,3],       n = 3
输出: [1,2,3,4,5,6]
解释: 合并后的数组已按非递减顺序排序。

题解

这个问题可以通过双指针法来解决。我们从两个数组的末尾开始,比较并移动较大的元素到 nums1 的末尾。

  1. 初始化指针:设置两个指针 p1 和 p2 分别指向 nums1 和 nums2 的末尾元素。
  2. 从后向前合并:从 nums1 的末尾开始,比较 nums1[p1-1] 和 nums2[p2-1],将较大的元素移动到 nums1 的末尾,并更新指针。
  3. 处理剩余元素:如果 nums2 中还有剩余元素,直接将它们复制到 nums1 的前面。

代码实现

void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {int p1 = m - 1;int p2 = n - 1;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--];}}while (p2 >= 0) {nums1[p--] = nums2[p2--];}
}

复杂度分析

● 时间复杂度:O(m + n),其中 m 和 n 分别是 nums1 和 nums2 的长度。我们需要遍历两个数组。
● 空间复杂度:O(1),因为我们是在原地修改 nums1,没有使用额外的空间。
这个算法的优势在于它直接在 nums1 上进行操作,不需要额外的数组空间。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com