315.count-of-smaller-numbers-after-self.go 628 B

12345678910111213141516171819202122232425262728293031323334353637
  1. func countSmaller(nums []int) []int {
  2. n := len(nums)
  3. res := make([]int, n)
  4. if n < 1 {
  5. return res
  6. }
  7. arr := []int{nums[n-1]}
  8. for i := n - 2; 0 <= i; i-- {
  9. l, r, target := 0, n-1-i, nums[i]
  10. for l < r {
  11. m := l + (r-l)/2
  12. if arr[m] < target {
  13. l = m + 1
  14. } else if target < arr[m] {
  15. r = m
  16. } else {
  17. l = m
  18. break
  19. }
  20. }
  21. for 0 < l && arr[l-1] == target {
  22. l-- // Filter out same elements
  23. }
  24. res[i] = l
  25. if l == n-1-i {
  26. arr = append(arr, target)
  27. } else {
  28. tmp := make([]int, n-i)
  29. copy(tmp, arr[:l])
  30. copy(tmp[l+1:], arr[l:])
  31. tmp[l] = target
  32. arr = tmp
  33. }
  34. }
  35. return res
  36. }