沉舟侧畔千帆过,病树前头万木春
leetcode刷题记-004
2019-03-08 / 2 min read

问题

两个有序数组寻找中间值问题

解题思路

思路一, 借鉴有序链表合并的思路

虽然leetcode标记为困难。但实际上很容易会想到“有序链表合并”的思路,在这个思路的基础之上记录下来中间值位置。对于中间值位置,由于在两个数组的长度之和是偶数的时候,需要取中间前后的两个数值计算中间值,所以需要记录前后两个值。附代码:

 public double findMedianSortedArrays(int[] nums1, int[] nums2) {
         int totalLength = nums1.length + nums2.length;
        boolean oddFlag = totalLength % 2 == 1;
        final int middleVal = oddFlag ? totalLength / 2 + 1 : totalLength / 2 + 1;

        //navigate likes two linklists merging
        int countIndex = 1, idx1 = 0, idx2 = 0;
        int midPrev = 0, current = 0;

        while (true) {
            midPrev = current;
            if (idx1 < nums1.length && idx2 < nums2.length) {
                if (nums1[idx1] <= nums2[idx2]) {
                    current = nums1[idx1];
                    idx1++;
                } else {
                    current = nums2[idx2];
                    idx2++;
                }
            } else if (idx1 >= nums1.length) {
                current = nums2[idx2];
                idx2++;
            } else {
                current = nums1[idx1];
                idx1++;
            }
        
            if (countIndex == middleVal) {
                return oddFlag ? current : (midPrev + current) / 2.0;
            }
            countIndex++;
        }
    }

这里需要说明的是midPrev记录前值,current记录当前值,总长是奇数长度的只需要关注current即可,否则需要用于加和求中间值,也就是return oddFlag ? current : (midPrev + current) / 2.0

Runtime: 24 ms, faster than 94.52% of Java online submissions for Median of Two Sorted Arrays.
Memory Usage: 49 MB, less than 58.57% of Java online submissions for Median of Two Sorted Arrays.
不幸的是,这个答案是错的!时间复杂度是O(m+n), 而不是O(log(m+n))。LeetCode居然没能够检测出来。

思路二 利用有序特征二分