leetcode 合併兩個有序陣列
阿新 • • 發佈:2018-12-14
給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為一個有序陣列。
說明: 初始化 nums1 和 nums2 的元素數量分別為 m 和 n。 你可以假設 nums1 有足夠的空間(空間大小大於或等於 m + n)來儲存 nums2 中的元素。 示例: 輸入: nums1 = [1,2,3,0,0,0], m = 3 nums2 = [2,5,6], n = 3 輸出: [1,2,2,3,5,6] 題目不難,第一種思路是設一個新的陣列,長度為m+n,然後注意的將nums1和nums2陣列比較,小的元素放入新的陣列中,最後將新的陣列copy到nums1中 程式碼:
class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { int []nums = new int[m+n]; int i = 0,j = 0,k = 0; while(i<m && j<n){ if(nums1[i]<=nums2[j]){ nums[k] = nums1[i]; i++; k++; } if(nums1[i]>nums2[j]){ nums[k] = nums2[j]; j++; k++; } } while(i<m){ nums[k] = nums1[i]; i++; k++; } while(j<n){ nums[k] = nums2[j]; j++; k++; } for(int l = 0;l<k;l++){ nums1[l] = nums[l]; } } }
程式碼比較理解起來比較簡單,不多說了,但是是不是還有更簡便的演算法呢? 如果我們從兩個有序陣列最後一個元素開始比較,較大的放入nums1陣列的m+n-1元素中, 然後索引後移,再將較大的放入m+n-2元素中,這樣下去就產生兩種情況, 第一種,就是nums1的所有元素被比較完了,直接將nums2裡的元素copy到nums1裡就可以了 第二種,nums2裡的所有元素被比較完了,由於兩陣列之前都是有序的,所以合併就完成了。 程式碼:
class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { int k = m+n-1; --m;--n; while(m>=0 && n>=0) nums1[k--] = nums1[m] > nums2[n] ? nums1[m--]:nums2[n--]; while(n>=0) nums1[k--] = nums2[n--]; } }
後一種方法我也是看到一位大佬的部落格寫的,一時找不到這位大佬的連結啦,哈哈,在這裡謝謝大佬啦