1. 程式人生 > 其它 >88. 合併兩個有序陣列 題目難度(簡單)

88. 合併兩個有序陣列 題目難度(簡單)

技術標籤:力扣LeetCode題庫題目解析(簡單)指標資料結構演算法leetcodejava

原題目連結:https://leetcode-cn.com/problems/merge-sorted-array/

做題思路一

  1. 準備好三個指標p1,p2,p3,指標意思就是指向下標的針線,設定指標的目的是為了方便定位,當前陣列比較到了哪個元素。

圖裡面裡面的0,1,2,3是指下標

在這裡插入圖片描述在這裡插入圖片描述
在這裡插入圖片描述

  1. 先把nums1拷貝一份,然後比較nums1_copy[p1]和nums2[p2]的大小
    2.1 如果nums1_copy[p1] < nums[p2] ,就把nums1_copy[p1]的元素放入nums1[p3]的位置,然後p1++,p3++

    2.2 如果nums1_copy[p1] >= nums[p2] ,就把nums2[p2]的元素放入nums1[p3]的位置,然後p2++,p3++

  2. 題目給出的nums1元素個數和nums2元素個數不一定相同,也就是說m不一定會等於n,所以就會導致可能某一個多元素陣列只比較了一部分,剩下的都沒有比較,由於nums1陣列和nums2陣列都是有序陣列,所以可以直接把剩下的沒比較的元素,直接移動到陣列後面

廢話不多說,直接上程式碼,我的程式碼里加了大量的註釋,相信各位看官可以理解,如果我有些沒寫清楚或者寫錯的,可以評論區或者私信我喔

		//把nums1陣列複製一份,這樣就把nums1陣列當成空陣列放排好序的資料
int[] nums1_copy = new int[m]; //開始拷貝 System.arraycopy(nums1,0,nums1_copy,0,m); //準備三個指標 int p1 = 0; //nums1_copy陣列用的 int p2 = 0; //nums2陣列用的 int p3 = 0; //nums1陣列用的 //開始判斷大小 while(p1 < m && p2 < n){ //小的先放 nums1[
p3++] = (nums1_copy[p1] < nums2[p2]) ? nums1_copy[p1++] : nums2[p2++]; } //如果只有一個數組比較完,也就是說還有另一個數組沒有比較完,就直接新增 //解釋一下m + n - p1 - p2的意思,m + n就是nums1的長度 //p1指標所指位置往左都是已經比較完的資料,同理p2也是 //所以m + n - p1 - p2得出的結果就是還沒比較資料元素個數 if(p1 < m){ System.arraycopy(nums1_copy,p1,nums1,p1 + p2,m + n - p1 - p2); } if(p2 < n){ System.arraycopy(nums2,p2,nums1,p1 + p2,m + n - p1 - p2); }

做題思路二

  1. 準備三個指標,p1指向nums1的尾部元素,p2指向nums2的尾部元素,p3指向最終合併後陣列的尾部元素

這裡圖把nums1當成最終合併後的陣列,題目給出的nums1有足夠的空間儲存m+n個元素,所以是可以的

在這裡插入圖片描述
在這裡插入圖片描述

  1. 當p1 >= 0的時候,nums1[p1]和nums2[p2]進行比較
    2.1 當nums1[p1] >= nums2[p2]的時候,將nums1[p1]上的元素放入nums1[p3],然後p1- -,p3- -
    2.2 當nums1[p1] < nums2[p2]的時候,將nums2[p2]上的元素放入nums1[p3],然後p2- -,p3- -
  2. 當p1 < 0的時候,由於兩個陣列本身就是有序陣列,所以可以直接把沒比較的元素直接放入後面,nums1[p3] = nums2[p2],然後p3- -,p2 - -
  3. 迴圈結束條件是p2 < 0

廢話不多說,直接上程式碼

 	   int p1 = m - 1; int p2 = n - 1; int p3 = m + n -1;
       while(p2 >= 0){
           if(p1 >= 0 && nums1[p1] > nums2[p2]){
               nums1[p3--] = nums1[p1--];
           }else{
               nums1[p3--] = nums2[p2--];
           }
       }