zoukankan      html  css  js  c++  java
  • 4. Median of Two Sorted Arrays


    June-22-2019

    这个题做得那叫一个烂。。

    找2个数组的中位数:
    先找到每个数组的1/4位数然后比较:较小数组里到中位的部分可以舍弃.
    这里其实已经把范围缩小到2个数组分别的0~k/4
    下一次计算就要找到2个数组的0~k/8,这样下去总能找到

    然后, 这个人是可以普及到Kth smalleast number in 2 arrays (or even N arrays), 这里做的是kth in 2 sorted arrays.

    这个题烦在edge case比较多:
    medium可以是1个,也可以是2个数的平均数,题里已经说了。
    因为用了kth smallest, 传进去的是index,要相应+1, -1,很容易弄错。比如一开始传入的是length / 2 + 1,5个数的话第三个是中位数,k = 3。里面计算的时候k-1,因为第三大的数index=2.
    如果其中一个超边界了,说明要找的值在另一个数组里,直接拿就行。

    class Solution {
        public double findMedianSortedArrays(int[] nums1, int[] nums2) {
            int length = nums1.length + nums2.length;
            
            if (length % 2 == 1) {
                return kthLargest(nums1, nums2, 0, 0, length / 2 + 1);
            } else {
                return (kthLargest(nums1, nums2, 0, 0, length / 2) + kthLargest(nums1, nums2, 0, 0, length / 2 + 1))/2.0;
            }
        }
        
        public double kthLargest(int[] nums1, int[] nums2, int l1, int l2, int k) {
           
            if (l1 >= nums1.length) {
                return nums2[l2 + k - 1];
            }
            if (l2 >= nums2.length) {
                return nums1[l1 + k - 1];
            }
            
            if (k == 1) {
                return Math.min(nums1[l1], nums2[l2]);
            }
            
            int indexOfKthFor1 = l1 + k / 2 - 1;
            int indexOfKthFor2 = l2 + k / 2 - 1;
            
            int val1 = indexOfKthFor1 < nums1.length ? nums1[indexOfKthFor1] : Integer.MAX_VALUE;
            int val2 = indexOfKthFor2 < nums2.length ? nums2[indexOfKthFor2] : Integer.MAX_VALUE;
            
            
            
            if (val1 > val2) {
                return kthLargest(nums1, nums2, l1, indexOfKthFor2 + 1, k - k / 2);
            } else {
                return kthLargest(nums1, nums2, indexOfKthFor1 + 1, l2, k - k / 2);
            }
     
        }
    }
    
  • 相关阅读:
    远程诊断DoIP
    基于linux内核包过滤技术的应用网关
    Boost内存池使用与测试
    C++ 编程规范
    大象——Thinking in UML
    C++ 创建类时常考虑的问题
    SLIP—串行线路上传输数据报的非标准协议
    神秘的程序员——编程的乐趣
    Bad Smell (代码的坏味道)
    模式与软件架构——软件架构的非功能特征
  • 原文地址:https://www.cnblogs.com/reboot329/p/11072516.html
Copyright © 2011-2022 走看看