LeetCode 2611. Mice and Cheese

原题链接在这里:https://leetcode.com/problems/mice-and-cheese/description/

题目:

There are two mice and n different types of cheese, each type of cheese should be eaten by exactly one mouse.

A point of the cheese with index i (0-indexed) is:

  • reward1[i] if the first mouse eats it.
  • reward2[i] if the second mouse eats it.

You are given a positive integer array reward1, a positive integer array reward2, and a non-negative integer k.

Return the maximum points the mice can achieve if the first mouse eats exactly k types of cheese.

Example 1:

Input: reward1 = [1,1,3,4], reward2 = [4,4,1,1], k = 2
Output: 15
Explanation: In this example, the first mouse eats the 2nd (0-indexed) and the 3rd types of cheese, and the second mouse eats the 0th and the 1st types of cheese.
The total points are 4 + 4 + 3 + 4 = 15.
It can be proven that 15 is the maximum total points that the mice can achieve.

Example 2:

Input: reward1 = [1,1], reward2 = [1,1], k = 2
Output: 2
Explanation: In this example, the first mouse eats the 0th (0-indexed) and 1st types of cheese, and the second mouse does not eat any cheese.
The total points are 1 + 1 = 2.
It can be proven that 2 is the maximum total points that the mice can achieve.

Constraints:

  • 1 <= n == reward1.length == reward2.length <= 105
  • 1 <= reward1[i], reward2[i] <= 1000
  • 0 <= k <= n

题解:

First mouse takes a[i], and second mouse takes b[j], where i and j are in exclusive in the set.

To maximize this, update a[i] + b[j] -> a[i] - b[i] + b[i] + b[j]. 

b[i] + b[j] = sum of b. 

Then it becomes to maximize a[i] - b[i] for k indices.

Use a priority queue for the minimum heap, the size is k.

Time Complexity: O(nlogk). n = reward1.length.

Space: O(k).

AC Java:

 1 class Solution {
 2     public int miceAndCheese(int[] reward1, int[] reward2, int k) {
 3         int res = 0;
 4         PriorityQueue<Integer> minHeap = new PriorityQueue<>();
 5         int n = reward1.length;
 6         for(int i = 0; i < n; i++){
 7             res += reward2[i];
 8             minHeap.add(reward1[i] - reward2[i]);
 9             if(minHeap.size() > k){
10                 minHeap.poll();
11             }
12         }
13 
14         while(!minHeap.isEmpty()){
15             res += minHeap.poll();
16         }
17 
18         return res;
19     }
20 }

 

posted @ 2024-05-13 07:03  Dylan_Java_NYC  阅读(5)  评论(0编辑  收藏  举报