-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path575-DistributeCandies.go
More file actions
97 lines (83 loc) · 3.21 KB
/
575-DistributeCandies.go
File metadata and controls
97 lines (83 loc) · 3.21 KB
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package main
// 575. Distribute Candies
// Alice has n candies, where the ith candy is of type candyType[i].
// Alice noticed that she started to gain weight, so she visited a doctor.
// The doctor advised Alice to only eat n / 2 of the candies she has (n is always even).
// Alice likes her candies very much, and she wants to eat the maximum number of different types of candies while still following the doctor's advice.
// Given the integer array candyType of length n, return the maximum number of different types of candies she can eat if she only eats n / 2 of them.
// Example 1:
// Input: candyType = [1,1,2,2,3,3]
// Output: 3
// Explanation: Alice can only eat 6 / 2 = 3 candies. Since there are only 3 types, she can eat one of each type.
// Example 2:
// Input: candyType = [1,1,2,3]
// Output: 2
// Explanation: Alice can only eat 4 / 2 = 2 candies. Whether she eats types [1,2], [1,3], or [2,3], she still can only eat 2 different types.
// Example 3:
// Input: candyType = [6,6,6,6]
// Output: 1
// Explanation: Alice can only eat 4 / 2 = 2 candies. Even though she can eat 2 candies, she only has 1 type.
// Constraints:
// n == candyType.length
// 2 <= n <= 10^4
// n is even.
// -10^5 <= candyType[i] <= 10^5
import "fmt"
func distributeCandies(candyType []int) int {
m := make(map[int]int)
for _, v := range candyType {
m[v]++
}
mid := len(candyType) >> 1 // 只吃一半的糖
candyTypeCount := len(m) // 糖果种类
if mid >= candyTypeCount {
return candyTypeCount
}
return mid
}
func distributeCandies1(candyType []int) int {
mp, length := make(map[int]int), len(candyType) / 2
for _, v := range candyType {
mp[v]++
if len(mp) > length {
return length
}
}
return len(mp)
}
func distributeCandies2(candyType []int) int {
count, m := 0, make(map[int] bool, len(candyType) / 2)
for _, v := range candyType {
if !m[v] {
m[v] = true
count++
if count == len(candyType) / 2 {
return count
}
}
}
return count
}
func main() {
// Example 1:
// Input: candyType = [1,1,2,2,3,3]
// Output: 3
// Explanation: Alice can only eat 6 / 2 = 3 candies. Since there are only 3 types, she can eat one of each type.
fmt.Println(distributeCandies([]int{1,1,2,2,3,3})) // 3
// Example 2:
// Input: candyType = [1,1,2,3]
// Output: 2
// Explanation: Alice can only eat 4 / 2 = 2 candies. Whether she eats types [1,2], [1,3], or [2,3], she still can only eat 2 different types.
fmt.Println(distributeCandies([]int{1,1,2,3})) // 2
// Example 3:
// Input: candyType = [6,6,6,6]
// Output: 1
// Explanation: Alice can only eat 4 / 2 = 2 candies. Even though she can eat 2 candies, she only has 1 type.
fmt.Println(distributeCandies([]int{6,6,6,6})) // 1
fmt.Println(distributeCandies1([]int{1,1,2,2,3,3})) // 3
fmt.Println(distributeCandies1([]int{1,1,2,3})) // 2
fmt.Println(distributeCandies1([]int{6,6,6,6})) // 1
fmt.Println(distributeCandies2([]int{1,1,2,2,3,3})) // 3
fmt.Println(distributeCandies2([]int{1,1,2,3})) // 2
fmt.Println(distributeCandies2([]int{6,6,6,6})) // 1
}