# 每日一题(11):寻找两个正序数组的中位数

image-20210204215553529

# 开始

今天飘了

觉得中等题不得劲

找个困难题刷刷

感觉怎么差不多...

这道题啥也不说

一看就老双指针了

思路也很简单,但是需要hack两处

  • 计算一下两个数组加起来总长度
  • 找到停止遍历的那个点last,记得奇偶数分开处理
  • 整两个指针i, j
  • 整两个暂存区curr,prev,这里如果是奇数长度就只需要用到一个,偶数需要用到两个
  • i + j < last,这里hack一下来处理数组越界问题,当其中一个数组遍历完了,我们就给它个Integer.MAX_VALUE确保可以让剩余数字被处理(是不是很机智
  • 后面就是枯燥的i++/j++移动指针以及返回结果了

看下代码实现吧

class Solution {
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
        int l = nums1.length + nums2.length;
        int last;
        if (l % 2 == 0) {
            last = l / 2 + 1;
        } else {
            last = (l + 1) / 2;
        }
        int curr = 0;
        int prev = 0;
        int i = 0;
        int j = 0;
        while (i + j < last) {
            prev = curr;
            int num1 = i == nums1.length ? Integer.MAX_VALUE : nums1[i];
            int num2 = j == nums2.length ? Integer.MAX_VALUE : nums2[j];
            if (num1 < num2) {
                curr = num1;
                i++;
            } else {
                curr = num2;
                j++;
            }
        }
        if (l % 2 == 0) {
            return (prev + curr) / 2.0;
        } else {
            return curr;
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

以及还不错的执行效率

一次过

image-20210204220403952

看了官方题解

发现自己居然直接用了相对优秀的思路

感觉可以困难题起步了(飘了飘了

下次继续~

最近更新: 7/5/2021, 2:10:34 PM