继续打卡算法题,今天学习的是第88题合并两个有序数组,这道题目是道简单题
。算法题的一些解题思路和技巧真的非常巧妙,每天看一看算法题和解题思路,我相信对我们的编码思维和编码能力有一些提升。
分析一波题目
本题需要将两个数组合并结果存入第一个数组,我们如果从前往后合,需要移动数据。我们可以从最大的数开始合并,将大的数填充第一个数组的后面,这样就不需要移动第一个数组的数据了。
本题解题技巧
1、使用三个指针,一个是index1最开始指向数组1最后一个元素,一个是index2指向数组2最后一个元素,一个指针指向数组1最后一个位置(表示下一次需要存的数)
编码解决
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
int newSize = m+n;
int startIndex = m+n -1;
int index1 = m-1;
int index2= n-1;
while (index1 >=0 || index2 >= 0) {
if(index1 >= 0 && index2>=0) {
int t1 = nums1[index1];
int t2 = nums2[index2];
if(t1 >= t2) {
nums1[startIndex] = t1;
index1--;
} else {
nums1[startIndex] = t2;
index2--;
}
} else if(index1 >=0){
int t1 = nums1[index1];
nums1[startIndex] = t1;
index1--;
} else if(index2 >=0) {
int t2 = nums2[index2];
nums1[startIndex] = t2;
index2--;
}
startIndex--;
}
}
}
总结
1、本题解题是从最大的数开始合并,避免了移动数组元素