1351. 统计有序矩阵中的负数

image.png
image.png

二分法

1 是一个递减序列。可以使用二分法来获取第一个非负数索引位置
2 如果数组的最后一个元素都大于0 整个数组都可以抛弃了
3 如果数组第一个元素小于0 整个数组都是负数了

  1. package main
  2. import "fmt"
  3. func countNegatives1(grid [][]int) int {
  4. var res int
  5. for i:=0;i<len(grid);i++{// 行
  6. for j:=0;j<len(grid[i]);j++{// 列
  7. if grid[i][j]<0{
  8. res++
  9. }
  10. }
  11. }
  12. return res
  13. }
  14. func countNegatives(grid [][]int) int {
  15. var res int
  16. for i:=0;i<len(grid);i++{
  17. c :=len(grid[i])
  18. if grid[i][c-1]>=0{
  19. continue
  20. }
  21. if grid[i][0]<0{
  22. res +=c
  23. continue
  24. }
  25. r := binarySearch(grid[i])
  26. res +=c-r
  27. }
  28. return res
  29. }
  30. func binarySearch(g []int) int {
  31. l:=0
  32. r :=len(g)-1
  33. for l<=r{
  34. mid :=l+(r-l)>>1
  35. if g[mid]>=0{
  36. l = mid+1
  37. }else {
  38. r =mid-1
  39. }
  40. }
  41. return l
  42. }
  43. func main() {
  44. grid := [][]int{{4,3,2,-1},{3,2,1,-1},{1,1,-1,-2},{-1,-1,-2,-3}}
  45. fmt.Println(countNegatives(grid))
  46. //fmt.Println(binarySearch([]int{4,3,2,-1}))
  47. //fmt.Println(binarySearch([]int{3,2,1,-1}))
  48. //fmt.Println(binarySearch([]int{1,1,-1,-2}))
  49. //fmt.Println(binarySearch([]int{0,1,2,3}))
  50. }

image.png