欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > LeetCode面试经典150题—合并两个有序数组—LeetCode88

LeetCode面试经典150题—合并两个有序数组—LeetCode88

2025/6/9 16:27:54 来源:https://blog.csdn.net/weixin_42606421/article/details/148517370  浏览:    关键词:LeetCode面试经典150题—合并两个有序数组—LeetCode88

原题请见:LeetCode88 合并两个有序数组

1、题目描述

请添加图片描述

2、题目分析

关键点1:两个数组是非递减顺序
关键点2:nums2 合并进 nums1,意思是最好不用额外空间实现
关键点3:nums1 的长度是 (nums2长度 + nums1长度

因为两数组是有序的,所以可以从两个数组的最左边(或者最右边),陆续比较哪个数组的边界元素更小(或更大)依次取出来扫到目标数组即可。
但考虑到本题目是在nums1 数组上原地排序,如果从左往右比较,会导致新元素插入nums1 的时候, nums1原来的元素需要依次右移,复杂度较高。
又考虑到 nums1 数组的右边 n 个元素都是空白的,所以从右往左比较,不会导致元素顺移问题。

3、题解

class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {// 最终目标数组的索引int idx = m + n - 1;int idx1 = m - 1;int idx2 = n - 1;// 依次取出来 nums1和nums2当前最大的,放在目标数组最右边while (idx1 >= 0 && idx2 >= 0) {if (nums1[idx1] >= nums2[idx2]) {nums1[idx--] = nums1[idx1--];} else {nums1[idx--] = nums2[idx2--];}}// 哪个数组还剩的话,说明这块整体小于另一个数组,剩下的直接陆续往左排while (idx1 >= 0) {nums1[idx--] = nums1[idx1--];}while (idx2 >= 0) {nums1[idx--] = nums2[idx2--];}}
}

版权声明:

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

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

热搜词