|
1 | 1 | package g0801_0900.s0870_advantage_shuffle;
|
2 | 2 |
|
3 |
| -// #Medium #Array #Sorting #Greedy #2022_03_28_Time_188_ms_(28.01%)_Space_116.9_MB_(5.12%) |
| 3 | +// #Medium #Array #Sorting #Greedy #2024_12_19_Time_42_ms_(99.16%)_Space_56.1_MB_(94.94%) |
4 | 4 |
|
5 |
| -import java.util.ArrayDeque; |
6 | 5 | import java.util.ArrayList;
|
7 | 6 | import java.util.Arrays;
|
8 |
| -import java.util.Deque; |
9 |
| -import java.util.HashMap; |
10 | 7 | import java.util.List;
|
11 |
| -import java.util.PriorityQueue; |
12 | 8 |
|
13 |
| -@SuppressWarnings("java:S5413") |
14 | 9 | public class Solution {
|
15 | 10 | public int[] advantageCount(int[] nums1, int[] nums2) {
|
16 |
| - PriorityQueue<Integer> pque = new PriorityQueue<>(); |
17 |
| - for (int e : nums1) { |
18 |
| - pque.add(e); |
19 |
| - } |
20 |
| - int l = nums1.length; |
21 |
| - HashMap<Integer, List<Integer>> map = new HashMap<>(); |
22 |
| - int[] n = new int[l]; |
23 |
| - System.arraycopy(nums2, 0, n, 0, l); |
24 |
| - Arrays.sort(n); |
25 |
| - Deque<Integer> sta = new ArrayDeque<>(); |
26 |
| - for (int i = 0; i < l && !pque.isEmpty(); i++) { |
27 |
| - List<Integer> p = map.getOrDefault(n[i], new ArrayList<>()); |
28 |
| - int x = pque.poll(); |
29 |
| - if (x > n[i]) { |
30 |
| - p.add(x); |
31 |
| - map.put(n[i], p); |
| 11 | + Arrays.sort(nums1); |
| 12 | + int[] result = new int[nums1.length]; |
| 13 | + int low = 0; |
| 14 | + boolean[] chosen = new boolean[nums1.length]; |
| 15 | + for (int i = 0; i < nums2.length; i++) { |
| 16 | + int pos = binSearch(nums1, nums2[i], low, chosen); |
| 17 | + if (pos != -1 && pos < nums1.length) { |
| 18 | + result[i] = nums1[pos]; |
| 19 | + chosen[pos] = true; |
32 | 20 | } else {
|
33 |
| - while (x <= n[i] && !pque.isEmpty()) { |
34 |
| - sta.push(x); |
35 |
| - x = pque.poll(); |
36 |
| - } |
37 |
| - if (x > n[i]) { |
38 |
| - p.add(x); |
39 |
| - map.put(n[i], p); |
40 |
| - } else { |
41 |
| - sta.push(x); |
42 |
| - } |
| 21 | + result[i] = -1; |
43 | 22 | }
|
44 | 23 | }
|
45 |
| - for (int i = 0; i < nums2.length; i++) { |
46 |
| - List<Integer> p = map.getOrDefault(nums2[i], new ArrayList<>()); |
47 |
| - int t; |
48 |
| - if (!p.isEmpty()) { |
49 |
| - t = p.get(0); |
50 |
| - p.remove(0); |
51 |
| - map.put(nums2[i], p); |
| 24 | + List<Integer> pos = new ArrayList<>(); |
| 25 | + int i = 0; |
| 26 | + for (boolean ch : chosen) { |
| 27 | + if (!ch) { |
| 28 | + pos.add(i); |
| 29 | + } |
| 30 | + i++; |
| 31 | + } |
| 32 | + int index = 0; |
| 33 | + for (i = 0; i < result.length; i++) { |
| 34 | + if (result[i] == -1) { |
| 35 | + result[i] = nums1[pos.get(index)]; |
| 36 | + index++; |
| 37 | + } |
| 38 | + } |
| 39 | + return result; |
| 40 | + } |
| 41 | + |
| 42 | + private int binSearch(int[] nums, int target, int low, boolean[] chosen) { |
| 43 | + int high = nums.length - 1; |
| 44 | + while (high >= low) { |
| 45 | + int mid = high - (high - low) / 2; |
| 46 | + if (nums[mid] > target && (mid == 0 || nums[mid - 1] <= target)) { |
| 47 | + while (mid < nums.length && chosen[mid]) { |
| 48 | + mid++; |
| 49 | + } |
| 50 | + return mid; |
| 51 | + } |
| 52 | + if (nums[mid] > target) { |
| 53 | + high = mid - 1; |
52 | 54 | } else {
|
53 |
| - t = sta.pop(); |
| 55 | + low = mid + 1; |
54 | 56 | }
|
55 |
| - nums1[i] = t; |
56 | 57 | }
|
57 |
| - return nums1; |
| 58 | + return -1; |
58 | 59 | }
|
59 | 60 | }
|
0 commit comments