• Median of Two Sorted Arrays(hard)


    题目要求:

    有两个排序的数组nums1nums2分别为m和n大小。

    找到两个排序数组的中位数。整体运行时间复杂度应为O(log(m + n))。

    示例:

    我的方法:

      分别逐个读取两个数组的数,放到一个新的数组里,由于两个数组本身是已经排序好的,所以只需要在放在新数组时候注意对比,放入完成后,就是一个排序好的数组了,就不需要重新排序增加时间复杂度。然后再找出中位数。

    public static double getMediumNum(int[] nums1, int[] nums2){
            int m = nums1.length;
            int n = nums2.length;
            int l = n + m;
            int[] nums = new int[l];
            int i=0, j=0, t=0;
            for(; t<l && (i<m) && (j<n); t++){
                if(nums1[i] < nums2[j]){
                    nums[t] = nums1[i];
                    i++;
                }else{
                    nums[t] = nums2[j];
                    j++;
                }
            }
            if(i == m && t != l){
                for(;t<l;t++,j++){
                    nums[t] = nums2[j];
                }
            }else if(j == n && t != l){
                for(;t<l;t++,i++){
                    nums[t] = nums1[i];
                }
            } 
            for(int a=0; a<nums.length; a++){
                System.out.println(nums[a]);
            }
            if(l%2 == 0){
                return ((double)nums[l/2] + (double)nums[l/2-1])/2;
            }
            return (double)nums[l/2];
        }

    leetcode方法:

     public double findMedianSortedArrays(int[] A, int[] B) {
            int m = A.length;
            int n = B.length;
            if (m > n) { // to ensure m<=n
                int[] temp = A; A = B; B = temp;
                int tmp = m; m = n; n = tmp;
            }
            int iMin = 0, iMax = m, halfLen = (m + n + 1) / 2;
            while (iMin <= iMax) {
                int i = (iMin + iMax) / 2;
                int j = halfLen - i;
                if (i < iMax && B[j-1] > A[i]){
                    iMin = iMin + 1; // i is too small
                }
                else if (i > iMin && A[i-1] > B[j]) {
                    iMax = iMax - 1; // i is too big
                }
                else { // i is perfect
                    int maxLeft = 0;
                    if (i == 0) { maxLeft = B[j-1]; }
                    else if (j == 0) { maxLeft = A[i-1]; }
                    else { maxLeft = Math.max(A[i-1], B[j-1]); }
                    if ( (m + n) % 2 == 1 ) { return maxLeft; }
    
                    int minRight = 0;
                    if (i == m) { minRight = B[j]; }
                    else if (j == n) { minRight = A[i]; }
                    else { minRight = Math.min(B[j], A[i]); }
    
                    return (maxLeft + minRight) / 2.0;
                }
            }
            return 0.0;
        }
  • 相关阅读:
    setInterval的停止与启动
    postgresql常用
    STM32学习笔记(四) RCC外设的学习和理解
    STM32学习笔记(九) 外部中断,待机模式和事件唤醒
    STM32的优先级的理解及其使用
    基于STM32的红外遥控重点解析
    红外协议之NEC协议
    常用运放选型一览表
    运放参数解释及常用运放选型
    算放大器分析----虚短和虚断(转载)
  • 原文地址:https://www.cnblogs.com/K-artorias/p/7696144.html
Copyright © 2020-2023  润新知