-
Notifications
You must be signed in to change notification settings - Fork 29
/
Copy pathNo1338.reduce-array-size-to-the-half.cs
80 lines (73 loc) · 2.07 KB
/
No1338.reduce-array-size-to-the-half.cs
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/*
* Difficulty:
* Medium
*
* Desc:
* Given an array arr. You can choose a set of integers and remove all the occurrences of these integers in the array.
* Return the minimum size of the set so that at least half of the integers of the array are removed.
*
* Example 1:
* Input: arr = [3,3,3,3,5,5,5,2,2,7]
* Output: 2
* Explanation:
* Choosing {3,7} will make the new array [5,5,5,2,2] which has size 5 (i.e equal to half of the size of the old array).
* Possible sets of size 2 are {3,5},{3,2},{5,2}.
* Choosing set {2,7} is not possible as it will make the new array [3,3,3,3,5,5,5] which has size greater than half of the size of the old array.
*
* Example 2:
* Input: arr = [7,7,7,7,7,7]
* Output: 1
* Explanation: The only possible set you can choose is {7}. This will make the new array empty.
*
* Example 3:
* Input: arr = [1,9]
* Output: 1
*
* Example 4:
* Input: arr = [1000,1000,3,7]
* Output: 1
*
* Example 5:
* Input: arr = [1,2,3,4,5,6,7,8,9,10]
* Output: 5
*
* Constraints:
* 1 <= arr.length <= 10^5
* arr.length is even.
* 1 <= arr[i] <= 10^5
*/
public class Solution {
private int Search(List<int> list, int target) {
int i = 0;
int j = list.Count - 1;
while (i <= j) {
int mid = (i + j) / 2;
if (list[mid] == target) return mid;
if (list[mid] > target) {
i = mid + 1;
} else {
j = mid - 1;
}
}
return i;
}
public int MinSetSize(int[] arr) {
Array.Sort(arr);
int i = 0;
List<int> counts = new List<int>();
while (i < arr.Length) {
int j = i;
while (i + 1 < arr.Length && arr[i] == arr[i + 1]) i += 1;
int count = i - j + 1;
int index = Search(counts, count);
counts.Insert(index, count);
i += 1;
}
int total = 0;
for (int j = 0; j < counts.Count; j += 1) {
total += counts[j];
if (total >= arr.Length / 2) return j + 1;
}
return counts.Count;
}
}