zoukankan      html  css  js  c++  java
  • Lc4-寻找两个有序数组的中位数

    /*
     * 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。
    
    请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
    
    你可以假设 nums1 和 nums2 不会同时为空。
    
    示例 1:
    
    nums1 = [1, 3]
    nums2 = [2]
    
    则中位数是 2.0
    示例 2:
    
    nums1 = [1, 2]
    nums2 = [3, 4]
    
    则中位数是 (2 + 3)/2 = 2.5
    
    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
     */
    public class Lc4 {
        /*
         * ·1:确定俩个数组总个数是奇数还是偶数,为了确定中位数计算方式 ·2:找到中位数的位置
         */
        public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
            // ·确定俩个数组总个数是奇数还是偶数
            boolean isEven = false;
            int sum = nums1.length + nums2.length;
            if ((sum) % 2 == 0) {
                isEven = true;
            }
            // ·合并俩个数组并进行排序
            int[] nums = new int[sum];
            for (int i = 0; i < nums1.length; i++) {
                nums[i] = nums1[i];
            }
            for (int i = 0; i < nums2.length; i++) {
                nums[nums1.length + i] = nums2[i];
            }
    
            shellSort(nums);
    
            // ·偶数
            if (isEven) {
                int x = sum / 2 - 1;
                int y = x + 1;
                return (double) (nums[x] + nums[y]) / 2;
    
                // ·奇数
            } else {
                int x = sum / 2 + 1 - 1;
                return (double) nums[x];
            }
        }
    
        // ·希尔排序: 在直接插入排序的基础上增加控制增量,逻辑上将数组分组,轮流对每一个数组排序
        //nlong(n)
        public static int[] shellSort(int[] nums) {
            for (int gap = nums.length / 2; gap > 0; gap /= 2) {
                for (int i = gap; i < nums.length; i++) {
                    for (int j = i; j >= gap && nums[j] < nums[j - gap]; j -= gap) {
                        int temp = nums[j];
                        nums[j] = nums[j - gap];
                        nums[j - gap] = temp;
                    }
                }
            }
            return nums;
        }
    
        public static void main(String[] args) {
            int[] nums1 = { 1, 2 };
            int[] nums2 = { 3, 4 };
            System.out.println(findMedianSortedArrays(nums1, nums2));
            System.out.println();
    //
    //        int[] nums = { 1, 2, 4, 5, 3 };
    //        System.out.println(shellSort(nums));
    //        System.out.println();
        }
    }
  • 相关阅读:
    压缩感知的由来
    VS2010自动崩溃问题
    随机过程好书推荐
    Kernel PCA
    稀疏性与L1范数
    豆瓣关于计算机视觉的书评及介绍
    压缩感知测量矩阵的研究现状(转)
    信号的功率谱、能量谱、频谱的区别(转)
    vc++ & matlab 换行符号
    arg min 的含义
  • 原文地址:https://www.cnblogs.com/xiaoshahai/p/12143762.html
Copyright © 2011-2022 走看看