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

    将找两个排序数组的中间值转换为找两个数组的第k小的数,findKthNumber是在两个数组中找第k小的数。

    每次找k/2个数,如果一个数组最末尾那个小于另一个,那这个数组的前面部分肯定属于整个k/2里面。

    start2 + mid + 1每次加了1,说明start1、start2都是新的数,属于当前的k的数,所以mid要用k/2减1,因为要计算当前start1、start2的数。

    要考虑start1、start2越界的情况,同时当前计算,按照k/2找的新的数的索引,也要考虑越界的情况。

    注意:start1、start2是比较的数字在两个数组中开始的下标(或者说索引,是从0开始到size()-1),k代表个数,具体说是当前还需要几个数字。

    class Solution {
    public:
        double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
            int length1 = nums1.size();
            int length2 = nums2.size();
            int len = length1 + length2;
            int mid = len/2;
            if(len % 2 == 0)
                return (findKthNumber(nums1,nums2,0,0,mid) + findKthNumber(nums1,nums2,0,0,mid+1))/2.0;
            else
                return findKthNumber(nums1,nums2,0,0,mid+1);
        }
            
        int findKthNumber(vector<int> nums1,vector<int> nums2,int start1,int start2,int k){
            int length1 = nums1.size();
            int length2 = nums2.size();
            if(start1 >= length1)
                return nums2[start2+k-1];
            if(start2 >= length2)
                return nums1[start1+k-1];
            if(k == 1)
                return min(nums1[start1],nums2[start2]);
            int mid = k/2 - 1;
            int num1 = start1 + mid >= length1 ? 0x7FFFFFFF : nums1[start1 + mid];
            int num2 = start2 + mid >= length2 ? 0x7FFFFFFF : nums2[start2 + mid];
            if(num1 > num2)
                return findKthNumber(nums1,nums2,start1,start2 + mid + 1,k-k/2);
            else
                return findKthNumber(nums1,nums2,start1 + mid + 1,start2,k-k/2);        
        }
        
    };

    https://www.cnblogs.com/lupx/p/lupeixin.html

    自己写了一遍:

    注意findKth的k这个参数是个数,即前k个,而不是下标

    class Solution {
    public:
        double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
            int length1 = nums1.size(),length2 = nums2.size();
            int start1 = 0,start2 = 0;
            int sum = length1 + length2;
            if(sum % 2)
                return findKth(nums1,nums2,start1,start2,sum/2 + 1);
            else
                return (findKth(nums1,nums2,start1,start2,sum/2) + findKth(nums1,nums2,start1,start2,sum/2 + 1))/2.0;
        }
        int findKth(vector<int> nums1,vector<int> nums2,int start1,int start2,int k){
            if(start1 >= nums1.size())
                return nums2[start2 + k - 1];
            if(start2 >= nums2.size())
                return nums1[start1 + k - 1];
            if(k == 1)
                return min(nums1[start1],nums2[start2]);
            int mid = k/2;
            int value1 = start1 + mid - 1 >= nums1.size() ? INT_MAX : nums1[start1 + mid - 1];
            int value2 = start2 + mid - 1 >= nums2.size() ? INT_MAX : nums2[start2 + mid - 1];
            if(value1 < value2)
                return findKth(nums1,nums2,start1 + mid,start2,k - k/2);
            else
                return findKth(nums1,nums2,start1,start2 + mid,k - k/2);
        }
    };
  • 相关阅读:
    Angular项目在npm install之后用ng serve启动发生错误
    (TODO)Angular的通道
    使用React+redux+Node.js+MongoDB开发(二)--使用redux
    Angular中使用DomSanitizer防范跨站脚本攻击类(XSS)的安全问题
    使用React+redux+Node.js+MongoDB开发(一)
    数组的数字和非数字下标的区别
    echarts绘制饼图时的一点特殊设置
    Angular项目中迭代生成的树,激活选中的节点,并将节点数据发送到父节点
    Ubuntu 设定壁纸自动切换的shell脚本
    Navicat for mysql linux 破解方法
  • 原文地址:https://www.cnblogs.com/ymjyqsx/p/9788015.html
Copyright © 2011-2022 走看看