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);
            }
     
        }
    }
    
  • 相关阅读:
    几款网络测试工具总结
    Linux安装telnet
    Linux下iptables 禁止端口和开放端口
    mysql创建某个数据库中的某张表 只读用户
    查看nginx版本号的几种方法
    Ngxtop-Nginx日志实时分析利器
    Nginx监控运维
    oracle经典书籍推荐
    华为典型局域网组网案例介绍(1)
    技术说明 路由器是如何工作的呢? 一个简单的解释
  • 原文地址:https://www.cnblogs.com/reboot329/p/11072516.html
Copyright © 2011-2022 走看看