import java.util.Arrays
/**
* ref:https://leetcode-cn.com/problems/merge-sorted-array
* 给你两个按非递减顺序排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。
* 请你合并nums2到nums1中,使合并后的数组同样按非递减顺序排列。
* 注意:最终,合并后数组不应由函数返回,而是存储在数组nums1中。
* 为了应对这种情况,nums1的初始长度为m+n,其中前m个元素表示应合并的元素,后n个元素为0,应忽略。nums2的长度为n。
* 输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
* 输出:[1,2,2,3,5,6]
* 解释:需要合并 [1,2,3] 和 [2,5,6], 合并结果是 [1,2,2,3,5,6]。
*/
public class MergeSortedArray {
/**
* 此题涉及归并排序思想:
* 不断地将当前序列平均分割成2个子序列,直到不能再分割。(序列中只剩1个元素)
* 不断地将2个子序列合并成一个有序序列,直到最终只剩下1个有序序列
* 实现思路:
* 1、定义两个下标index1和index2分别指向nums1和nums2两个数组的最后一个元素的常量,
* 以及当前在填充数据下标curr指向nums1的最后一位置。
* 2、比较nums1[index1]和nums2[index2],取较大者赋值给nums[curr],并对较大者下标和curr进行减1。
* 3、继续进行下一轮处理,直到index2的下标小于0,则排序结束。
* 4、针对nums1的数据为空时,需要直接将nums2的数据复制到num1中,此时需要直接将nums2的值赋值给nums1即可。
* @param nums1
* @param m
* @param nums2
* @param n
*/
public static void marge(int[] nums1,int m,int nums2[],int n){
// 数组num1的最大下标就是数组内数据长度-1
int index1 = m -1
// 数组num1的最大下标就是数组内数据长度-1
int index2 = n -1
// 当前处理数据的下标
int curr = nums1.length-1
while(index2>=0){
// 获取num1和num2中的最大的一个元素,进行比较。较大的一个放入num1的最后一个元素。继续下一轮迭代
if(index1>0&&nums1[index1]>nums2[index2]) {
nums1[curr--] = nums1[index1--]
// 当nums1[index1]小于等于nums2[index]或者nums1为空,直接将nums2中元素赋值即可。
}else{
nums1[curr--] = nums2[index2--]
}
}
}
public static void main(String[] args){
// [1, 2, 2, 3, 5, 6]
int[] nums1 = new int[]{1,2,3,0,0,0}
int m = 3
int[] nums2 = new int[]{2,5,6}
int n = 3
//[1]
/*int[] nums1 = new int[]{1}
int m = 1
int[] nums2 = new int[]{0}
int n = 0
//[1]
/* int[] nums1 = new int[]{0}
int m = 0
int[] nums2 = new int[]{1}
int n = 1
marge(nums1,m,nums2,n)
System.out.println(Arrays.toString(nums1))
}
}