Find the Kth element from two sorted arrays

这道题的关键是如何建立两个数组的之间的关系。插入排序法和双指针法可以达到线性时间复杂度。这里记录一个更加巧妙的思路,利用二分法达到O(logm + logn)的时间复杂度。

原文地址 https://articles.leetcode.com/find-k-th-smallest-element-in-union-of/

 1 import java.util.Arrays;
 2 
 3 public class FindKthElement {
 4     public int findKthElement(int[] arr1, int[] arr2, int k) {
 5         // k>0, assert arr1 != null, arr2 != null, k <= arr1.length + arr2.lengt
 6         return findKth(arr1, arr2, arr1.length, arr2.length, k);
 7     }
 8 
 9     private int findKth(int[] arr1, int[] arr2, int m, int n, int k) {
10         int i = k * m / (m + n);
11 
12         // important relation of two arrays
13         int j = k - 1 - i;
14 
15         int Ai_1 = (i == 0) ? Integer.MIN_VALUE : arr1[i - 1];
16         int Ai = (i == m) ? Integer.MAX_VALUE : arr1[i];
17         int Bj_1 = (j == 0) ? Integer.MIN_VALUE : arr2[j - 1];
18         int Bj = (j == n) ? Integer.MAX_VALUE : arr2[j];
19 
20         if (Ai > Bj_1 && Ai < Bj) {
21             return Ai;
22         }
23         if (Bj > Ai_1 && Bj < Ai) {
24             return Bj;
25         }
26 
27         // assert Ai < Bj && Ai < Bj_1 ||  Bj < Ai && Bj < Ai_1
28         if (Ai < Bj) {
29             return findKth(Arrays.copyOfRange(arr1, i + 1, m), Arrays.copyOfRange(arr2, 0, j), m - i - 1, j, k - i - 1);
30         } else {
31             return findKth(Arrays.copyOfRange(arr1, 0, j), Arrays.copyOfRange(arr2, j + 1, n), i, n - j - 1, k - j - 1);
32         }
33     }
34 
35     public static void main(String[] args) {
36         FindKthElement findKthElement = new FindKthElement();
37         int[] arra = {1, 3, 5, 7, 9};
38         int[] arrb = {2, 4, 6, 8, 10};
39         System.out.println(findKthElement.findKthElement(arra, arrb, 6));
40     }
41 }

 

 

posted @ 2018-08-18 17:21  OpenMyWorld  阅读(265)  评论(0)    收藏  举报