LeetCode 4. Median of Two Sorted Arrays ( C )-Hard

題目為給定兩個已排序之整數陣列,請撰寫程式回傳兩陣列的中位數,如中位數有兩個則回傳兩者之平均值。

題目與範例如下

Given two sorted arrays nums1 and nums2 of size m and n respectively, return the median of the two sorted arrays.

 

Example 1:

Input: nums1 = [1,3], nums2 = [2]
Output: 2.00000
Explanation: merged array = [1,2,3] and median is 2.
Example 2:

Input: nums1 = [1,2], nums2 = [3,4]
Output: 2.50000
Explanation: merged array = [1,2,3,4] and median is (2 + 3) / 2 = 2.5.
Example 3:

Input: nums1 = [0,0], nums2 = [0,0]
Output: 0.00000
Example 4:

Input: nums1 = [], nums2 = [1]
Output: 1.00000
Example 5:

Input: nums1 = [2], nums2 = []
Output: 2.00000
 

Constraints:

nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1[i], nums2[i] <= 106
 

Follow up: The overall run time complexity should be O(log (m+n)).

我的策略為先計算中間值為兩個整數或一個整數,並計算第一個中位數的位置。透過迴圈依序取出兩個整數陣列中最小的值,當該值為中位數時,如中位數為兩整數則儲存於temp中,並於下次回圈中回傳平均值,如中位數僅為單一數值則直接回傳。

下面是我的程式碼

double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){
    int yn = (nums1Size + nums2Size) % 2;
    short int middle = (nums1Size + nums2Size + 1)/2 -1;
    short int listptr1 = 0,listptr2 = 0, counter = 0;
    short int flag;                                  // 1 = next num at nums1, 2 = next num at nums1
    
    int tempnum = 0;
    
    while(listptr1<nums1Size || listptr2<nums2Size){
        
        if(listptr1 == nums1Size){
            flag = 2;
        }
        else if(listptr2 == nums2Size){
            flag = 1;
        }
        else{
            if(nums1[listptr1] > nums2[listptr2]){
                flag = 2;
            }
            else{
                flag = 1;
            }
        }
                
        if(counter == middle + 1){
            switch(flag){
                case 1 :
                    return (double) (nums1[listptr1] + tempnum)/2;
                case 2 :
                    return (double) (nums2[listptr2] + tempnum)/2;
            }
        }
        else if(counter == middle){
            switch(yn){
                case 0 :
                    switch(flag){
                        case 1 :
                            tempnum = nums1[listptr1];
                            listptr1 ++;
                            counter ++;
                            break;
                        case 2 :
                            tempnum = nums2[listptr2];
                            listptr2 ++;
                            counter ++;
                            break;
                    }
                    break;
                case 1 :
                    switch(flag){
                        case 1 :
                            return (double) nums1[listptr1];
                        case 2 :
                            return (double) nums2[listptr2];
                    }
            }
        }
        else{
            switch(flag){
                case 1 :
                    listptr1 ++;
                    counter ++;
                    break;
                case 2 :
                    listptr2 ++;
                    counter ++;
                    break;
                    
            }            
        }
    }
    return 0;
}

yn 為判斷幾個中位數,1為一個中位數,2為兩個中位數。

middle 為判斷地一個中位數的位址 ( index ) ,listptr1 用來遍歷 nums1 整數陣列,listptr2 用來遍歷 nums2 整數陣列。

counter 用來判別已遍歷的數量。

flag 判別此輪要取出之數字為 nums1 陣列中的 ,或是 nums2 陣列中的,1 為 nums1,2 為 nums2。

下面是時間與空間之消耗

Runtime: 4 ms, faster than 99.89% of C online submissions for Median of Two Sorted Arrays.

Memory Usage: 6.4 MB, less than 74.69% of C online submissions for Median of Two Sorted Arrays.

此次執行測試的次數比較多,進而發現同一份程式碼每次執行的時間與空間消耗其實都不相同,所以僅能當參考使用。

下一題連結 : LeetCode 5. Longest Palindromic Substring ( C )-Medium

Add a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *