• 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);
        }
    };
  • 相关阅读:
    运算符
    练习
    JAVA学习日报 9/23
    JAVA学习日报 8.22
    JAVA学习日报 8.21
    第一节:SpringMVC 处理请求数据【1】
    第六节:@RequestMapping 映射请求占位符 @PathVariable 注解
    第一节:REST 风格的URL地址约束
    第二节:REST风格的案例及源码分析
    (一)IOC 容器:【1】@Configuration&@Bean 给容器中注册组件
  • 原文地址:https://www.cnblogs.com/ymjyqsx/p/9788015.html
Copyright © 2020-2023  润新知