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 }

浙公网安备 33010602011771号