双指针算法(四):力扣 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]
示例二:
输入:nums1 = [1], m = 1, nums2 = [], n = 0
输出:[1]
解题思路
看到这个题目,当时的第一反应就是;把第二组直接放在第一组的后面,然后sort排序一次就好了;
这么做也不是不可以,就是在双指针方法面前显得很缓慢,而且很笨拙~
现在来看一下双指针算法的解题思路把
首先,两个数组是升序排列的,我们从最大值开始找(从最小值开始找也行,只不过题目给了现成的 m 和 n)
我们首先使用两个指针就是已经给了的 m 和 n;
然后我们使用额外的一个指针,定义为 pos ,复制用,并且让 pos = m+ n - 1;
pos 的位置,就是结果的最后面的位置;
然后,m 对应的值 和 n 对应的值进行比较;
最大的由pos复制过去,并且对应的指针前移;
如果 m 还没有走完,但是 n 已经走完了,说明 第二个数组已经完全排序进去了,第一个剩下的部分已经是有序的,不用处理;
如果 m 走完了,但是 n 没有走完,说明第二个数组还有剩余的没有加入的元素,由于本身也是有序的,直接遍历加入即可;
需要注意的是,指针的移动使用了 ++ 和 – 的性质,所以和三目运算符配合起来,非常巧妙
代码
class Solution {public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {// 方法一:添加后sort排序// for(int i=0; i<n; i++){// nums1[m++] = nums2[i];// }//把数组2替换掉数组1里的0,然后.sort()排序// sort(nums1.begin(),nums1.end());// 方法二: 双指针算法int pos = m-- + n-- - 1; // pos指针,复制用; -1 因为是下标; 从后往前,先放较大的// 留意这个三目表达式;利用了 -- ++ 的技巧,很经典while (m >= 0 && n >= 0 ) {nums1[pos--] = nums1[m] > nums2[n] ? nums1[m--] : nums2[n--];}while (n >= 0 ) {nums1[pos--] = nums2[n--] ;}}
};
结果
双指针算法(四):力扣 88.合并两个有序数组 | 经典例题相关推荐
- 力扣88 - 合并两个有序数组【归并排序思维】
九九归一 一.题目描述 二.思路分析 三.整体代码展示 四.代码详解[步步算法图解] 情况一:nums2遍历完,nums1无需动 情况二:nums1遍历完,nums2还有剩余元素[特殊] 五.总结与提 ...
- 力扣: 88. 合并两个有序数组
思路:用双指针法 void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){int *arr=(in ...
- 双指针:88. 合并两个有序数组
题目链接 88. 合并两个有序数组 解题思路 一. 合并数组后排序,时间复杂度为O((n+m)log(n+m)) 代码: 快排详解 class Solution {public void merge( ...
- (数组)88. 合并两个有序数组(java)
1.题目描述: 2.实例: 3.分析: 感觉过于简单,都不好意思发出来,但作为记录一步步走来,还是分析分析 非递减就是递增嘛 递增总没错 而且人家数组提供有方法直接用嘛 我的做法就是把第二个数组的值 ...
- 88. 合并两个有序数组 JavaScript实现
88. 合并两个有序数组 1.直接合并后排序 将nms2放到nums1的后面,然后进行排序 var merge = function(nums1, m, nums2, n) {// 将splice将n ...
- Leetcode-D33-数组-66. 加一88. 合并两个有序数组
一.复习 移除元素-双指针问题,一个指针用来记录下一个扫描哪个元素:另一个指针用来记录下一个写哪里 搜索插入位置-二分法,不断与中间位置的数字比较大小值,缩小区间范围:当两侧只差一个单位时,看val是 ...
- LeetCode-双指针-88. 合并两个有序数组
88. 合并两个有序数组 思路:归并排序,一长一短,肯定会有一个先放完,放完后把另一个拷贝过去即可. 为了避免覆盖所以从最后开始向前放最大的元素 class Solution {public:void ...
- LeetCode 88. 合并两个有序数组 golang
88. 合并两个有序数组 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 ...
- 88. 合并两个有序数组 golang
88. 合并两个有序数组 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 ...
最新文章
- vue代码转换成小程序
- (转)IntelliJ Idea 的相关使用
- Win32 调用netapi32实现用户枚举
- USACO 3.2 kimbits DP
- 【Linux】18_日志管理rsyslog系统日志管理
- Windows:系统环境变量配置提示系统环境变量太大的问题三种解决方案亲测可用
- java睡眠后继续执行_Java线程只能有千个,而Go的Goroutine能有上百万个
- 12种主要的Dropout方法:如何应用于DNNs,CNNs,RNNs中的数学和可视化解释
- 结构光双目视觉测距原理
- Spring Boot:(三)开发Web应用之Thymeleaf篇
- 网盘用户分享独播剧链接 百度未及时封禁一审被判赔偿百万余元
- 达内2018年最新前端
- PaddlePaddle eval后报错terminate all the procs的解决方法
- 实用网站 |懒人爱学习
- kb4023057安装失败_微软向旧版Windows 10推送易升补丁出现无法安装问题
- Android屏幕尺寸详解
- 虚拟机VMware破解版教程下载
- 【软考】2020下半年软件设计师 易错知识点(1)
- Raft 算法 详细版介绍
- ArduPilot之开源代码Sensor Drivers设计