zoukankan      html  css  js  c++  java
  • 有序数组取中值

    一、有两个有序数组 查找出中位数,并且输出

      如:arr1[] = {1, 3, 5, 7, 9, 11, 343, 5645, 56756}; arr2[] = {0, 2, 4, 6, 8, 10}; 输出值为 7.0

       1、通过合并取值,时间复杂度O(m+n)

        

    private static double findMidNumber(int arr1[], int arr2[]) {
        int len1 = arr1.length;
        int len2 = arr2.length;
    
        int arr3[] = new int[len1 + len2];
    
        int i = 0,j = 0, k = 0;
        while (i < len1 && j < len2) {
            if (arr1[i] <= arr2[j]) {
                arr3[k++] = arr1[i];
                i++;
            } else {
                arr3[k++] = arr2[j];
                j++;
            }
        }
        while (i < len1) {
            arr3[k++] = arr1[i++];
        }
    
        while (j < len2) {
            arr3[k++] = arr2[j++];
        }
    
        System.out.println("find + " + k);
        if (arr3.length % 2 == 0) {
            return (arr3[(len1 + len2) / 2 - 1] + arr3[(len1 + len2) / 2]) / 2.0;
        } else {
            return arr3[(len1 + len2) / 2] * 1.0;
        }
    }
      2、取最大中值,时间O(k)
        
    private static double findMidNumber1(int arr1[], int arr2[]) {
            int len1 = arr1.length;
            int len2 = arr2.length;
    
            int arr3[] = new int[(len1 + len2) / 2 +1];
    
            int i = 0,j = 0, k = 0, index = 0;
            while (index < arr3.length && j < len2 && i < len1) {
                if (arr1[i] <= arr2[j]) {
                    arr3[index++] =arr1[i];
                    i ++;
                } else {
                    arr3[index++] =arr2[j];
                    j++;
                }
                k ++;
            }
            while (index < arr3.length) {
                if ( i < len1) {
                    arr3[index++] =arr1[i++];
                }
                if ( j < len2) {
                    arr3[index++] =arr2[j++];
                }
                k ++;
            }
            System.out.println("find1 + " + k);
            if (arr3.length % 2 == 1) {
                return (arr3[arr3.length - 2] + arr3[arr3.length - 1] )/ 2.0;
            } else {
                return arr3[arr3.length - 1] * 1.0;
            }
    
        }

      3、递归二分查找法,时间复杂度为O(log(m+n)

    private static double findMidNumber3(int arr1[], int arr2[]) {
            int len1 = arr1.length;
            int len2 = arr2.length;
    
            int l = (len1 + len2 + 1) / 2;
            int r = (len1 + len2 + 2) / 2;
    
            return (findMin(arr1, 0, arr2, 0, l) + findMin(arr1, 0, arr2, 0, r)) / 2.0;
        }
    
        private static int findMin(int arr1[], int l, int arr2[],int r, int k) {
            if (l > arr1.length - 1) return arr2[r + k -1];
            if (r > arr2.length - 1) return arr1[l + k -1];
            if (k == 1) return Math.min(arr1[l], arr2[r]);
    
            n++;
            int min1 = Integer.MIN_VALUE, min2 = Integer.MIN_VALUE;
    
            if (l + k/2 -1 < arr1.length) {
                min1 = arr1[l + k/2 -1];
            }
            if (r + k/2 -1 < arr2.length) {
                min2 = arr2[r + k/2 -1];
            }
            return  (min1 < min2) ? findMin(arr1, l + k/2, arr2, r, k - k/2) :
                findMin(arr1, l, arr2, r + k/2, k - k/2);
        }
      
  • 相关阅读:
    slice()、substring()、substr()的区别用法
    程序员如何快速上手一个自己不太熟悉的新项目?有什么技巧?
    计算重复字符串长度
    计算机视觉算法研发岗招聘要求
    C++进阶STL-2
    C++进阶STL-1
    拼硬币
    序列找数
    寻找合法字符串
    字符串是否由子串拼接
  • 原文地址:https://www.cnblogs.com/junxing/p/11033212.html
Copyright © 2011-2022 走看看