88. 合併兩個有序陣列 題目難度(簡單)
阿新 • • 發佈:2021-01-24
技術標籤:力扣LeetCode題庫題目解析(簡單)指標資料結構演算法leetcodejava
原題目連結:https://leetcode-cn.com/problems/merge-sorted-array/
做題思路一
- 準備好三個指標p1,p2,p3,指標意思就是指向下標的針線,設定指標的目的是為了方便定位,當前陣列比較到了哪個元素。
圖裡面裡面的0,1,2,3是指下標
-
先把nums1拷貝一份,然後比較nums1_copy[p1]和nums2[p2]的大小
2.1 如果nums1_copy[p1] < nums[p2] ,就把nums1_copy[p1]的元素放入nums1[p3]的位置,然後p1++,p3++ -
題目給出的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);
}
做題思路二
- 準備三個指標,p1指向nums1的尾部元素,p2指向nums2的尾部元素,p3指向最終合併後陣列的尾部元素
這裡圖把nums1當成最終合併後的陣列,題目給出的nums1有足夠的空間儲存m+n個元素,所以是可以的
- 當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- - - 當p1 < 0的時候,由於兩個陣列本身就是有序陣列,所以可以直接把沒比較的元素直接放入後面,nums1[p3] = nums2[p2],然後p3- -,p2 - -
- 迴圈結束條件是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--];
}
}