🚩传送门:牛客题目

题目

给出一个整数数组[NC]22. 合并两个有序的数组 - 图1和有序的整数数组[NC]22. 合并两个有序的数组 - 图2,请将数组[NC]22. 合并两个有序的数组 - 图3合并到数组[NC]22. 合并两个有序的数组 - 图4中,变成一个有序的升序数组

注意:

  1. 可以假设[NC]22. 合并两个有序的数组 - 图5数组有足够的空间存放[NC]22. 合并两个有序的数组 - 图6数组的元素

    [NC]22. 合并两个有序的数组 - 图7[NC]22. 合并两个有序的数组 - 图8中初始的元素数目分别为[NC]22. 合并两个有序的数组 - 图9[NC]22. 合并两个有序的数组 - 图10[NC]22. 合并两个有序的数组 - 图11的数组空间大小为[NC]22. 合并两个有序的数组 - 图12

  2. 不要返回合并的数组,返回是空的,将数组[NC]22. 合并两个有序的数组 - 图13的数据合并到[NC]22. 合并两个有序的数组 - 图14里面就好了

  3. [NC]22. 合并两个有序的数组 - 图15数组在_[0,m-1]_的范围也是有序的

示例1

输入: A: [4,5,6,0,0,0],m=3 B: [1,2,3],n=3 返回值:A: [1,2,3,4,5,6]

解题思路:拷贝 + 排序

我的代码

  1. import java.util.Arrays;
  2. public class Solution {
  3. public void merge(int A[], int m, int B[], int n) {
  4. //1.拷贝
  5. System.arraycopy(B, 0, A, m, n);
  6. //2.排序
  7. Arrays.sort(A);
  8. }
  9. }

解题思路:二路归并

此二路归并,从右向左比,比较大的数值并过去。

图:起始状态
image.png
图:二路归并演示示意图
image.png

我的代码

  1. public class Solution {
  2. public void merge(int A[], int m, int B[], int n) {
  3. int i=m-1;//A
  4. int j=n-1;//B
  5. int t=m+n-1;
  6. //1.二者均非空选择较大值填入A[t]
  7. while(i>=0&&j>=0){
  8. if(A[i]>B[j]){
  9. A[t--]=A[i--];
  10. }else{
  11. A[t--]=B[j--];
  12. }
  13. }
  14. //2.B数组空了,将A剩余填入即可
  15. while(i>=0){
  16. A[t--]=A[i--];
  17. }
  18. //3.A数组空了,将B剩余填入即可
  19. while(j>=0){
  20. A[t--]=B[j--];
  21. }
  22. }
  23. }