问题描述:
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.
Note:
The number of elements initialized in nums1 and nums2 are m and n respectively.
You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2.
Example:
Input:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
Output: [1,2,2,3,5,6]
问题解决思路:
合并数组的关键就是从后往前插入,因为不能开辟新的空间,所以我们将使用三个指针来完成这个算法
flag用来记录当前填补的位置
length1用来记录array1当前比较的位置
length2用来记录array2当前比较的位置
这里默认array1是无限长的,所以是将array2最终插入array1
代码实现:
package Algorithm;
public class Example4 {
//合并数组的关键就是从后往前插入,我们需要三个指针
//flag用来记录当前填补的位置
//length1用来记录array1当前比较的位置
//length2用来记录array2当前比较的位置
//这里默认array1是无限长的,所以是将array2最终插入array1
public void Mergearray(int[] array1, int length1, int[] array2, int length2){
int flag = length1 + length2 - 1;
int var = length1 + length2 - 1;
while(flag >= 0){
//这一段其实是为了让大家更好的理解
//因为两个数组不一定是一样长的
//在比较的过程中,总有length1或者length2先到达零。那么后到达的就可以不用再进行任何比较了
if (length1 < 1){
array1[flag--] = array2[--length2];
continue;
}
if (length2 < 1){
array1[flag--] = array1[--length1];
continue;
}
//这里就是进行比较的代码
if (array1[length1-1] > array2[length2-1]){
array1[flag--] = array1[--length1];
}
else{
array1[flag--] = array2[--length2];
}
}
//最后输出数组
for (int i = 0; i <= var; i++){
System.out.print(array1[i]+" ");
}
}
public static void main(String[] args) {
int[] array1 = {1,2,3,0,0,0};//这里的000代表为空闲位置,不是数字零
int[] array2 = {2,5,6};
int length1 = 3;
int length2 = 3;
Example4 object = new Example4();
object.Mergearray(array1, length1, array2, length2);
}
}
总结:
在解决数组类的问题时,比较常用的就是使用指针记录数组下标,从而达到解决问题的目的