leetcode median Of Two Sorted Arrays 求兩個有序數組的中位數 第四題

public class medianOfTwoSortedArrays_4 {
    /**
     * 
     * 因爲兩個數組是有序的,分別爲每個數組設定一個指針,按照數的大小,交替向前走,思路同將兩個有序數組合併爲一個有序數組
     * 記錄兩個指針的總步數和,不能超過兩數組長度和的一半
     * 循環終止時,若爲奇數,則最新的數的指針指在中位數的前一位上;若爲偶數,則最新的數的指針指在兩位中位數的第一位上;二者均需找到下一個位置的數。具體代碼見60-80行
     * 15-26行對特殊情況進行處理
     * 時間複雜度O(*)空間複雜度O(1)
     * 
     * @param nums1
     * @param nums2
     * @return
     */
    public  static double  findMedianSortedArrays(int[] nums1, int[] nums2) {

        int length1 = nums1.length;
        int length2 = nums2.length;
        int lengthSum = length1 + length2;
        boolean flag = false;

        if(lengthSum % 2 == 0){
            flag = true;
        }
        if(lengthSum == 0){
            return  0;
        }
        if(length1 == 0 && length2 < 2){
                return nums2[0];
        }
        if(length2 == 0 && length1 < 2){
            return nums1[0];
        }
        int nums1Index = 0;
        int nums2Index = 0;
        int indexMid = lengthSum / 2;
        double result = 0;
        boolean whileNums1 = false;
        boolean whileNums2 = false;
        while(nums1Index < length1 && nums2Index < length2 && nums1Index + nums2Index < indexMid){
            if(nums1[nums1Index] <= nums2[nums2Index]){
                ++nums1Index;
                whileNums1 = true;
                whileNums2 = false;
            }else{
                ++nums2Index;
                whileNums1 = false;
                whileNums2 = true;

            }
        }
        while (nums1Index < length1 && nums1Index + nums2Index < indexMid){
            ++nums1Index;
            whileNums1 = true;
            whileNums2 = false;
        }
        while (nums2Index < length2 && nums1Index + nums2Index < indexMid){
            ++nums2Index;
            whileNums1 = false;
            whileNums2 = true;
        }
            int indexMidValue = 0;
            if( whileNums1 == true && whileNums2 == false){
                indexMidValue = nums1[--nums1Index];
            }else{
                indexMidValue = nums2[--nums2Index];
            }
            int indexMidValue2 = 0;
            if( whileNums1 == true && whileNums2 == false){
                nums1Index++;
            }else{
                nums2Index++;
            }
            if(nums1Index < length1){
                if(nums2Index < length2){
                    indexMidValue2 = nums1[nums1Index]<nums2[nums2Index]?nums1[nums1Index]:nums2[nums2Index];
                }else {
                    indexMidValue2 = nums1[nums1Index];
                }
            }else {
                indexMidValue2 = nums2[nums2Index];
            }
        if (flag){
            // 偶數
            result = (double)(indexMidValue + indexMidValue2) / 2;
        }else {
            // 奇數
            result = (double)indexMidValue2;
        }
        return result;
    }
    public  static  void  main(String[] args){
        int[] nums1 ={};
        int[] nums2 ={1};
        System.out.println(findMedianSortedArrays(nums1,nums2));
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章