[LeetCode] Median of two sorted arrays.

本文详细介绍了如何解决LeetCode经典问题——寻找两个有序数组的中位数,通过逐步分析和代码实现,强调了处理边界条件的重要性,并分享了避免代码复制错误的技巧。文章涵盖了算法优化、复杂度分析和实际应用案例,旨在帮助初学者理解和掌握解决此类问题的方法。
我也不想一开始就刷这道题,只是看顺序在那儿,就花样做死了一把。。作为这么经典的题,自己裸想是一点idea都木有的。 网上这道题的讨论成千上万,所以重点变成找个比较合适的答案看懂,理解然后自己默写出来。 这个问题的关键在将它转化成找第K大的数,然后如果是两数组长度之和是奇数,就找中间那个,如果是偶数就找两次,再平均。而如果像1337大神那样想一次考虑到数组长度之和为奇偶数的情况,解法太复杂,不适合初学者,果断放弃。而找到第K大的数则相对简单一点,每次在两数组中各取第K/2个数进行比较,总能去掉K/2个数。 剩下的坑就只剩边界条件了,我差点就被边界条件给坑死了。 总之这道题刷的很血泪,一步一跪,也算是见识到了LeetCode的厉害。
public class Solution {
  public double findMedianSortedArrays(int A[], int B[]) {
    int m = A.length, n = B.length;
    int total = m + n;
    if ((total & 0x1) == 0x1){
      return find(A, B, total/2); //start from 0. 
    }
    return (find(A, B, total/2 - 1) + find(A, B, total/2)) / 2.0;
  <span style="font-family: Arial, Helvetica, sans-serif;">}</span>
    
	
  private double find(int A[], int B[], int k){
    if (A.length > B.length) return find(B, A, k); //always deal with the first array is shorter. 
    if (A.length == 0) return B[k];
    if (k == 0) return Math.min(A[0], B[0]);
    int i = Math.min(k/2, A.length -1), j = k - (i + 1); // when A = {1}, B = {1}, k = 1, then i = 0, j must be 0!  
    if (A[i] < B[j]){
      return find(Arrays.copyOfRange(A, i + 1, A.length), B, k - (i + 1)); // dump {A[0] ... A[i]}, so k minus (i + 1).  
    } else if (A[i] > B[j]){
      return find(A, Arrays.copyOfRange(B, j + 1, B.length), k - (j + 1));
    } else {
      return A[i]; // because there is i elements before A[i] and j elements before B[j], and i + j = k -1, 
                   //So there is already k - i element before A[i] and B[j], and A[i] == B[j], so we just return either A[i] or B[j].  
    }
  }
	
}
另外的教训是不要偷懒想copy自己的code片段,很容易copy完不改,又会出一堆错误!!
边界条件的经验:自己run一些例子,从空的开始,找几个corner case跑一跑,不要急着提交!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值