funcfindLightIndex(nums []int, n int)int { var l, r = 0, len(nums) - 1 if nums[0] >= n { return-1 } for l < r { m := (l + r + 1) / 2 if nums[m] >= n { r = m - 1 } else { l = m } } return l }
funcfindRightIndex(nums []int, n int)int { var l, r = 0, len(nums) - 1 if nums[len(nums)-1] <= n { returnlen(nums) } for l < r { m := (l + r) / 2 if nums[m] <= n { l = m + 1 } else { r = m } } return r }
funcmaxFrequency(nums []int, k int, numOperations int)int { sort.Ints(nums) var ret = 0 var maxN = nums[len(arr)-1] var minN = nums[0] for n := minN; n <= maxN; n++ { a := findRightIndex(arr, n) - findLightIndex(arr, n) - 1 b := findRightIndex(arr, min(maxN, n+k)) - findLightIndex(arr, max(0, n-k)) - 1 c := a + min(b-a, numOperations) ret = max(ret, c) } return ret }
//寻找第一个小于n的值的下标 funcfindLightIndex(nums []int, n int)int { if nums[0] >= n { return-1 } return sort.Search(len(nums), func(i int)bool { return nums[i] >= n }) - 1 } //寻找第一个大于n的值的下标 funcfindRightIndex(nums []int, n int)int { if nums[len(nums)-1] <= n { returnlen(nums) } return sort.Search(len(nums), func(i int)bool { return nums[i] > n }) }
funcsub2(nums []int, k int, length int)bool { for i := 0; i+length <= len(nums); i++ { end := i + length - 1 //只要确定左右边界差值小于等于2k就能确定中间的值一定能通过加[-k,k]得到n if nums[end]-nums[i] <= 2*k { returntrue } } returnfalse }
funcsub1(nums []int, k int, op int)int { var ret = 0 //这里主要需要计算[n,n]的长度所以需要二分查找 for _, n := range nums { r1 := findRightIndex(nums, n) l1 := findLightIndex(nums, n) r2 := findRightIndex(nums, n+k) l2 := findLightIndex(nums, n-k) ret = max(ret, (r1-l1-1)+min((r2-l2-1)-(r1-l1-1), op)) } return ret }