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(); } }
不恋尘世浮华,不写红尘纷扰