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

    题目

    就是找两个有序list的中间值

    其实就是两个list 合一就可以了
    题目给我们一个list, 我们可以往后移动一下 这样[0]位置的元素代表INT_MIN, 然后中间是 [1, len(list)] 这个是当前的list, 然后 > len(list) 就是INT_MAX
    这样我们就可以表示出来

    num1 num2
    num3 num4

    我们要保证中间值是 num1和num3的较大者, 由于num1 <= num2 && num3 <= num4
    我们仅仅需要保证 num1<=num4 && num3 <= num2就可以得到最后的中间值
    所以二分check一下就可以了

    题解

    class Solution {
    public:
        double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
            int k1 = nums1.size(), k2 = nums2.size();
            if(k1 < k2)
                return findMedianSortedArrays(nums2, nums1);
            int K = k1 + k2;
            int MED = (K+1)/2;
            int l = 0, r = k1;
            int n1, n2, n3, n4;
            while(l <= r) {
                int m1 = (l+r)/2;
                int m2 = MED - m1;
                
                n1 = (m1 <= 0) ? INT_MIN : (m1 > k1) ? INT_MAX : nums1[m1-1];
                n2 = (m1+1 <= 0) ? INT_MIN : (m1+1 > k1) ? INT_MAX : nums1[m1];
                n3 = (m2 <= 0) ? INT_MIN : (m2 > k2) ? INT_MAX : nums2[m2-1];
                n4 = (m2+1 <= 0) ? INT_MIN : (m2+1 > k2) ? INT_MAX : nums2[m2]; 
                
                if(n1 <= n4 && n3 <= n2)
                    break;
                else if(n1 > n4)
                    r = m1 - 1;
                else 
                    l = m1 + 1;
            }
            if (K & 1) {
                return max(n1, n3);
            } else {
                return 1.0 * (max(n1, n3) + min(n2, n4)) / 2;
            }
        }
    };
    
  • 相关阅读:
    Nightmare Ⅱ HDU
    Full Tank? POJ
    2601 电路维修 (双端队列bfs优先队列bfs(最短路))
    Sudoku POJ
    Pushing Boxes POJ
    2501 矩阵距离 (bfs)
    【排序】绝境求生
    【排序】逆序对IV
    【排序】紧急集合
    【排序】常用排序法
  • 原文地址:https://www.cnblogs.com/Draymonder/p/11224872.html
Copyright © 2011-2022 走看看