632.smallest-range.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. type array [][]int
  2. func (a array) Len() int { return len(a) }
  3. func (a array) Less(i, j int) bool { return a[i][0] < a[j][0] }
  4. func (a array) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
  5. func smallestRange(nums [][]int) []int {
  6. var a array
  7. m := make(map[int]int)
  8. for i := range nums {
  9. for j := range nums[i] {
  10. if num := nums[i][j]; j == 0 || num != nums[i][j-1] {
  11. a = append(a, []int{num, i})
  12. }
  13. }
  14. }
  15. sort.Sort(a)
  16. l, r, k, n := 0, 0, len(nums), len(a)
  17. min := math.MaxInt32
  18. res := make([]int, 2)
  19. for r < n {
  20. for r < n && len(m) != k {
  21. for {
  22. m[a[r][1]]++
  23. r++
  24. if n-1 < r || a[r-1][0] != a[r][0] {
  25. break
  26. }
  27. }
  28. }
  29. if len(m) == k && a[r-1][0]-a[l][0] < min {
  30. res[0], res[1] = a[l][0], a[r-1][0]
  31. min = a[r-1][0] - a[l][0]
  32. }
  33. for l < r && len(m) == k {
  34. for {
  35. m[a[l][1]]--
  36. if m[a[l][1]] == 0 {
  37. delete(m, a[l][1])
  38. }
  39. l++
  40. if len(m) == k && a[r-1][0]-a[l][0] < min {
  41. res[0], res[1] = a[l][0], a[r-1][0]
  42. min = a[r-1][0] - a[l][0]
  43. }
  44. if l == r || a[l-1][0] != a[l][0] {
  45. break
  46. }
  47. }
  48. }
  49. }
  50. return res
  51. }