|
2 | 2 |
|
3 | 3 | public class Main {
|
4 | 4 |
|
5 |
| - class LRUCache { |
6 |
| - |
7 |
| - class Node { |
8 |
| - Node prev, next; |
9 |
| - int key, val; |
10 |
| - |
11 |
| - Node(int key, int val) { |
12 |
| - this.key = key; |
13 |
| - this.val = val; |
14 |
| - prev = next = this; |
15 |
| - } |
16 |
| - |
17 |
| - void remove() { |
18 |
| - prev.next = next; |
19 |
| - next.prev = prev; |
20 |
| - } |
21 |
| - |
22 |
| - void add(Node head) { |
23 |
| - next = head.next; |
24 |
| - head.next.prev = this; |
25 |
| - prev = head; |
26 |
| - head.next = this; |
27 |
| - } |
| 5 | + public double findMedianSortedArrays(int[] nums1, int[] nums2) { |
| 6 | + int len1 = nums1.length; |
| 7 | + int len2 = nums2.length; |
| 8 | + int total = len1 + len2; |
| 9 | + if (total % 2 == 0) { |
| 10 | + return (findKth(nums1, nums2, 0, len1 - 1, 0, len2 - 1, total/2) + |
| 11 | + findKth(nums1, nums2, 0, len1 - 1, 0, len2 - 1, total/2 + 1))/2.0f; |
| 12 | + } else { |
| 13 | + return findKth(nums1, nums2, 0, len1 - 1, 0, len2 - 1, total/2 + 1); |
28 | 14 | }
|
| 15 | + } |
29 | 16 |
|
30 |
| - private Node mHead; |
31 |
| - private HashMap<Integer, Node> mMap; |
32 |
| - private int mCapacity; |
33 |
| - |
34 |
| - public LRUCache(int capacity) { |
35 |
| - mMap = new HashMap<>(); |
36 |
| - mCapacity = capacity; |
37 |
| - mHead = new Node(0, 0); |
| 17 | + public double findKth(int[] nums1, int[] nums2, int start1, int end1, int start2, int end2, int k) { |
| 18 | + int len1 = end1 - start1 + 1; |
| 19 | + int len2 = end2 - start2 + 1; |
| 20 | + if (len1 > len2) { |
| 21 | + return findKth(nums2, nums1, start2, end2, start1, end1, k); |
38 | 22 | }
|
39 |
| - |
40 |
| - public int get(int key) { |
41 |
| - if (!mMap.containsKey(key)) { |
42 |
| - return -1; |
43 |
| - } |
44 |
| - Node node = mMap.get(key); |
45 |
| - node.remove(); |
46 |
| - node.add(mHead); |
47 |
| - return node.val; |
| 23 | + if (len1 == 0) { |
| 24 | + return nums2[start2 + k - 1]; |
48 | 25 | }
|
49 |
| - |
50 |
| - public void put(int key, int value) { |
51 |
| - Node node = mMap.get(key); |
52 |
| - if (node == null) { |
53 |
| - node = new Node(key, value); |
54 |
| - mMap.put(key, node); |
55 |
| - } else { |
56 |
| - node.val = value; |
57 |
| - node.remove(); |
58 |
| - } |
59 |
| - node.add(mHead); |
60 |
| - if (mMap.size() > mCapacity) { |
61 |
| - Node prev = mHead.prev; |
62 |
| - prev.remove(); |
63 |
| - mMap.remove(prev.key); |
64 |
| - } |
| 26 | + if (k == 1) { |
| 27 | + return Math.min(nums1[start1], nums2[start2]); |
| 28 | + } |
| 29 | + int ia = Math.min(k/2, len1); |
| 30 | + int ib = k - ia; |
| 31 | + if (nums1[start1 + ia - 1] > nums2[start2 + ib - 1]) { |
| 32 | + return findKth(nums1, nums2, start1, end1, start2 + ib, end2, k - ib); |
| 33 | + } else if (nums1[start1 + ia - 1] < nums2[start2 + ib - 1]) { |
| 34 | + return findKth(nums1, nums2, start1 + ia, end1, start2, end2, k - ia); |
| 35 | + } else { |
| 36 | + return nums1[start1 + ia - 1]; |
65 | 37 | }
|
66 | 38 | }
|
67 | 39 |
|
| 40 | + |
68 | 41 | public static void main(String[] args) {
|
69 | 42 |
|
70 | 43 | }
|
|
0 commit comments