-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcount-the-number-of-fair-pairs.go
68 lines (60 loc) · 1.27 KB
/
count-the-number-of-fair-pairs.go
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
package main
import (
"fmt"
"sort"
)
// source: https://leetcode.com/problems/count-the-number-of-fair-pairs/
func countFairPairs(nums []int, lower int, upper int) int64 {
n := len(nums)
var ans int64
sortedNums := make([]int, len(nums))
copy(sortedNums, nums)
sort.Ints(sortedNums)
for _, x := range nums {
li, ui := sort.SearchInts(sortedNums, lower-x), sort.SearchInts(sortedNums, upper-x)
if x >= lower-x && x <= upper-x {
ans--
}
for ui < n && sortedNums[ui] == upper-x {
ui++
}
ans += int64(ui - li)
}
return ans / 2
}
func main() {
testCases := []struct {
nums []int
lower int
upper int
want int64
}{
{
nums: []int{0, 1, 7, 4, 4, 5},
lower: 3,
upper: 6,
want: 6,
},
{
nums: []int{1, 7, 9, 2, 5},
lower: 11,
upper: 11,
want: 1,
},
}
successes := 0
for _, tc := range testCases {
x := countFairPairs(tc.nums, tc.lower, tc.upper)
status := "ERROR"
if fmt.Sprint(x) == fmt.Sprint(tc.want) {
status = "OK"
successes++
}
fmt.Println(status, " Expected: ", tc.want, " Actual: ", x)
}
if l := len(testCases); successes == len(testCases) {
fmt.Printf("===\nSUCCESS: %d of %d tests ended successfully\n", successes, l)
} else {
fmt.Printf("===\nFAIL: %d tests failed\n", l-successes)
}
}