两个有序数组的中位数
来源:互联网 发布:知乎 一人之下漫画 编辑:程序博客网 时间:2024/06/05 03:13
1、两个相等长度的有序数组求上中位数
arr1=[1, 2, 3, 4],arr2= [3,4,5,6],上中位数为3
时间复杂度O(logN):
public int getUpMedian(int[] arr1 , int[] arr2){ int start1 =0; int end1 = arr1.length-1; int start2=0; int end2 = arr2.length-1; int mid1 =0; int mid2 =0; int offset = 0; while(start1 < end1){ mid1 = (start1+end1)/2; mid2 = (start2+end2)/2; offset = ((end1 - start1+1)&1)^1; //分奇偶 if(arr1[mid1] > arr2[mid2]){ end1 = mid1; start2=mid2+offset; }else if(arr1[mid1]<arr2[mid2]){ start1 = mid1 + offset; end2 = mid2; }else { return arr1[mid1]; } } return Math.min(arr1[start1], arr2[start2]); }
2、两个有序数组求中位数(引申为第k小)
奇数为中间,偶数为中间两个数的一半。
(1)时间复杂度为log(m+n)
public double findMedianSortedArrays(int[] nums1, int[] nums2) { int m = nums1.length, n = nums2.length; int k = (m + n) / 2; if((m+n)%2==0){ return (findKth(nums1,nums2,0,0,m,n,k)+findKth(nums1,nums2,0,0,m,n,k+1))/2; } else { return findKth(nums1,nums2,0,0,m,n,k+1); } } private double findKth(int[] arr1, int[] arr2, int start1, int start2, int len1, int len2, int k){ // 保证arr1是较短的数组 if(len1>len2){ return findKth(arr2,arr1,start2,start1,len2,len1,k); } if(len1==0){ return arr2[start2 + k - 1]; } if(k==1){ return Math.min(arr1[start1],arr2[start2]); } int p1 = Math.min(k/2,len1) ; //精华所在 int p2 = k - p1; if(arr1[start1 + p1-1]<arr2[start2 + p2-1]){ return findKth(arr1,arr2,start1 + p1,start2,len1-p1,len2,k-p1); } else if(arr1[start1 + p1-1]>arr2[start2 + p2-1]){ return findKth(arr1,arr2,start1,start2 + p2,len1,len2-p2,k-p2); } else { return arr1[start1 + p1-1]; } }
(2)时间复杂度log(min(M,N))
参考左神的书《程序员代码面试指南》P468
参考:https://segmentfault.com/a/1190000002988010
https://leetcode.com/problems/median-of-two-sorted-arrays/description/
阅读全文
0 0
- 两个有序数组的中位数
- 两个有序数组的中位数
- 两个有序数组的中位数
- 两个有序数组的中位数
- 两个有序数组的中位数
- 两个有序数组的中位数
- 两个有序数组的中位数
- 求两个有序数组的中位数
- 求两个有序数组的中位数
- 求两个有序数组的中位数
- 求两个有序数组的中位数
- 求解两个有序数组的中位数
- 求两个有序数组的中位数
- 找两个有序数组的中位数
- 求两个有序数组的中位数
- 找到两个有序数组的中位数
- 求两个有序数组的中位数
- 两个有序数组的中位数 【算法】
- spring-mybatis多表查询
- Swift_学习笔记_调用ObjectiveC方法
- 图的遍历
- NYOJ 26 孪生素数问题
- Buttomsheetdialog的简单实用
- 两个有序数组的中位数
- 485. Max Consecutive Ones
- 排序-简单选择
- main 函数的标准原型
- mock.js的真实数据模拟
- Nginx——基本功能介绍
- 线程的几种可用状态
- java 幂等性
- bootstrap固定导航条导致页面内跳转被覆盖的解决办法