leetcode media of an sort array
2014-04-08 23:25
357 查看
本题要求时间复杂度为log(m+n),不让合并用额外的空间:
算法描述:
1 选定两个数组A,B并计算长度,根据长度和m+n是偶数还是奇数,分为两种查找中位的方式;
如果和为偶数:Value[(m+n)/2]+Value[(m+n)/2+1]
如果为奇数:Value[(m+n)/2]
2 然后通过迭代计算中位数
通过假定A长度小于B,然后选择每个数组的中间k/2元素,如果A的中位数,小于B的中位数,则A中位数前面的元素都小于value(k),这样重新选择A的起始点,并减去k值为k-pa;如果,B中的小,这让B的长度减去pb,然后重新开始;
重视让A的长度小于B的长度;
k每次递减,m,n分别表示数组剩余长度;index1,index2分别表示前面去掉的元素个数;
注意:边界问题:
如果k为1:表示从新起始的元素开始的A,B第一个元素的较小值
如果m为0;表示较小长度的数组已经分析完了,直接选择第二个数组制定位置的元素就可以
算法描述:
1 选定两个数组A,B并计算长度,根据长度和m+n是偶数还是奇数,分为两种查找中位的方式;
如果和为偶数:Value[(m+n)/2]+Value[(m+n)/2+1]
如果为奇数:Value[(m+n)/2]
2 然后通过迭代计算中位数
通过假定A长度小于B,然后选择每个数组的中间k/2元素,如果A的中位数,小于B的中位数,则A中位数前面的元素都小于value(k),这样重新选择A的起始点,并减去k值为k-pa;如果,B中的小,这让B的长度减去pb,然后重新开始;
重视让A的长度小于B的长度;
k每次递减,m,n分别表示数组剩余长度;index1,index2分别表示前面去掉的元素个数;
注意:边界问题:
如果k为1:表示从新起始的元素开始的A,B第一个元素的较小值
如果m为0;表示较小长度的数组已经分析完了,直接选择第二个数组制定位置的元素就可以
package com.demo.acm; public class MedianOfTwo { private double findKth(int[] a,int m,int[] b,int n,int k,int index1,int index2){ //System.out.println("m:"+m+" n:"+n+" k:"+k+" index1:"+index1+" index2:"+index2); if(m>n){ return findKth(b,n,a,m,k,index2,index1); } if(m==0){ //System.out.println("*"); return b[index2+k-1]; } if(k==1){ //System.out.println("-"+index1+" "+index2); return Math.min(a[index1],b[index2]); } int pa=Math.min(k/2, m),pb=k-pa; if(a[index1+pa-1]<b[index2+pb-1]){ return findKth(a,m-pa,b,n,k-pa,pa+index1,index2); }else if(a[index1+pa-1]>b[index2+pb-1]){ return findKth(a,m,b,n-pb,k-pb,index1,index2+pb); }else{ return a[index1+pa-1]; } } public double findMedianSortedArrays(int[] A, int[] B) { int m = A.length; int n = B.length; int total = m + n; //System.out.println("A:"+A.length+" B:"+B.length); if ((total & 1) == 0) { return (findKth(A, m, B, n, total / 2,0,0) + findKth(A, m, B, n, total / 2 + 1,0,0)) / 2; } else { return findKth(A, m, B, n, total / 2 + 1,0,0); } } public static void main(String[] args){ MedianOfTwo media=new MedianOfTwo(); int[] A={1}; int[] B={5,6,7}; System.out.println(media.findMedianSortedArrays(B, A)); } }
相关文章推荐
- Minimum number of swaps required to sort an array
- [LeetCode] Find the Derangement of An Array 找数组的错排
- LeetCode Maximum XOR of Two Numbers in an Array
- geeksforgeeks@ Sorting Elements of an Array by Frequency (Sort)
- [LeetCode]Degree of an Array
- LeetCode-697:Degree of an Array (度相同的最小子数组)
- LeetCode Degree of an Array
- Leetcode Maximum XOR of Two Numbers in an Array
- leetcode 697[easy]---Degree of an Array
- How to sort an array of hashes into hashes with multiple values for a key?
- 前缀树及应用两数异或Leetcode之 Maximum XOR of Two Numbers in an Array
- leetcode-634 Find the Derangement of An Array(水水的模拟)
- Given an array of integers, sort the array according to frequency of elements
- How do I sort an array of hashes by a value in the hash?
- LeetCode-697-Degree of an Array-E
- How do I sort an array of hashes by a value in the hash?
- 【LeetCode-421】Maximum XOR of Two Numbers in an Array
- LeetCode 421 Maximum XOR of Two Numbers in an Array 解题报告
- LeetCode_697_Degree of an Array
- [LeetCode] Maximum XOR of Two Numbers in an Array 数组中异或值最大的两个数字