1. 程式人生 > >【LeetCode & 劍指offer刷題】查詢與排序題5:Merge Sorted Array

【LeetCode & 劍指offer刷題】查詢與排序題5:Merge Sorted Array

【LeetCode & 劍指offer 刷題筆記】目錄(持續更新中...)

Merge Sorted Array

Given two sorted integer arrays   nums1   and   nums2 , merge   nums2   into   nums1   as one sorted array.
Note:
  • The number of elements initialized in  nums1 and  nums2 are  m and  n respectively.
  • You may assume that  nums1 has enough space (size that is greater or equal to  m
     +  n) to hold additional elements from  nums2.
Example: Input: nums1 = [1,2,3,0,0,0], m = 3 nums2 = [2,5,6], n = 3   Output: [1,2,2,3,5,6]
C++
  //問題:合併兩個有序陣列 //方法一:開闢臨時陣列,通過比較兩個有序陣列,複製到臨時陣列中,再把排好序的陣列複製回原陣列 /*class Solution { public:     void merge(vector<int>& nums1, int m, vector<int>& nums2, int n)     {                 int i=0,j=0,k=0;         vector<int> temp(m+n);         while(i<m&&j<n)         {             temp[k++] = (nums1[i]<nums2[j])? nums1[i++]:nums2[j++];         }         while(i<m)         {             temp[k++] = nums1[i++];         }         while(j<n)         {             temp[k++] = nums2[j++];         }                 int size = nums1.size();         if(size >= (m+n))             nums1 = temp;//將排序好元素賦值過去         else         {             nums1.assign(temp.begin(), temp.begin()+size); //僅僅賦值部分元素             cout<<"nums1空間不足!!"<<endl;         }             } };*/ //方法二:從後往前掃描,依次複製(未開闢額外空間,效率更優) class Solution { public :     void merge ( vector < int >& nums1 , int m , vector < int >& nums2 , int n )     {         int i = m - 1 , j = n - 1 , k = nums1 . size ()- 1 ; //從後往前掃描, i,j分別指向有序陣列末尾,k指向nums1空間的末尾         while ( i >= 0 && j >= 0 )         {             nums1 [ k --] = ( nums1 [ i ] > nums2 [ j ])? nums1 [ i --]: nums2 [ j --];         }         while ( j >= 0 ) //將nums2剩餘元素複製過去         {             nums1 [ k --] = nums2 [ j --];         }             } };