Binary Search
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| class Solution { public int maxProfitAssignment(int[] difficulty, int[] profit, int[] worker) { int[][] pairs = new int[difficulty.length][]; for (int i = 0; i < pairs.length; i++) { pairs[i] = new int[]{difficulty[i], profit[i]}; } Arrays.sort(pairs, Comparator.comparingInt(o -> o[0])); for (int i = 1; i < pairs.length; i++) { pairs[i][1] = Math.max(pairs[i - 1][1], pairs[i][1]); }
int maxProfit = 0; for (int w : worker) { maxProfit += findMaxProfit(pairs, w); } return maxProfit; }
private int findMaxProfit(int[][] pairs, int w) { int left = 0, right = pairs.length - 1; while (left <= right) { int mid = (left + right) >>> 1; if (pairs[mid][0] < w) { left = mid + 1; } else if (pairs[mid][0] > w) { right = mid - 1; } else { left = mid + 1; } }
return right == -1 ? 0 : pairs[right][1]; } }
|
Two Pointers
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| class Solution { public int maxProfitAssignment(int[] difficulty, int[] profit, int[] worker) { int[][] pairs = new int[difficulty.length][2]; for (int i = 0; i < pairs.length; i++) { pairs[i][0] = difficulty[i]; pairs[i][1] = profit[i]; } Arrays.sort(pairs, Comparator.comparingInt(o -> o[0])); for (int i = 1; i < pairs.length; i++) { pairs[i][1] = Math.max(pairs[i - 1][1], pairs[i][1]); }
Arrays.sort(worker); int ans = 0, maxProfit = 0, i = 0; for (int w : worker) { while (i < pairs.length && pairs[i][0] <= w) { maxProfit = Math.max(maxProfit, pairs[i][1]); i++; } ans += maxProfit; }
return ans; } }
|
References
826. Most Profit Assigning Work