-
Notifications
You must be signed in to change notification settings - Fork 1
/
OddCells.go
120 lines (116 loc) · 2.74 KB
/
OddCells.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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
package array
//给你一个 m x n 的矩阵,最开始的时候,每个单元格中的值都是 0。
//
//另有一个二维索引数组 indices,indices[i] = [ri, ci] 指向矩阵中的某个位置,其中 ri 和 ci 分别表示指定的行和列(从 0 开始编号)。
//
//对 indices[i] 所指向的每个位置,应同时执行下述增量操作:
//
//ri 行上的所有单元格,加 1 。
//ci 列上的所有单元格,加 1 。
//给你 m、n 和 indices 。请你在执行完所有 indices 指定的增量操作后,返回矩阵中 奇数值单元格 的数目。
//
//
//
//示例 1:
//
//
//
//输入:m = 2, n = 3, indices = [[0,1],[1,1]]
//输出:6
//解释:最开始的矩阵是 [[0,0,0],[0,0,0]]。
//第一次增量操作后得到 [[1,2,1],[0,1,0]]。
//最后的矩阵是 [[1,3,1],[1,3,1]],里面有 6 个奇数。
//示例 2:
//
//
//
//输入:m = 2, n = 2, indices = [[1,1],[0,0]]
//输出:0
//解释:最后的矩阵是 [[2,2],[2,2]],里面没有奇数。
//
//
//提示:
//
//1 <= m, n <= 50
//1 <= indices.length <= 100
//0 <= ri < m
//0 <= ci < n
//
//
//进阶:你可以设计一个时间复杂度为 O(n + m + indices.length) 且仅用 O(n + m) 额外空间的算法来解决此问题吗?
//
//来源:力扣(LeetCode)
//链接:https://leetcode.cn/problems/cells-with-odd-values-in-a-matrix
//著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
//暴力解法
//时间复杂度O(m*n),空间复杂度O(m*n)
func oddCells(m int, n int, indices [][]int) int {
matrix := make([][]int, m)
for i := 0; i < m; i++ {
matrix[i] = make([]int, n)
}
for _, indice := range indices {
r := indice[0]
c := indice[1]
for i := 0; i < n; i++ {
matrix[r][i]++
}
for i := 0; i < m; i++ {
matrix[i][c]++
}
}
res := 0
for i := 0; i < m; i++ {
for j := 0; j < n; j++ {
if matrix[i][j]%2 == 1 {
res++
}
}
}
return res
}
//空间优化解法
//时间复杂度O(m*n),空间复杂度O(m+n)
func oddCells2(m int, n int, indices [][]int) int {
rows := make([]int, m)
cols := make([]int, n)
for _, indice := range indices {
r := indice[0]
c := indice[1]
rows[r]++
cols[c]++
}
res := 0
for i := 0; i < m; i++ {
for j := 0; j < n; j++ {
if (rows[i]+cols[j])%2 == 1 {
res++
}
}
}
return res
}
//优化解法3,这个确实想不到
func oddCells3(m int, n int, indices [][]int) int {
rows := make([]int, m)
cols := make([]int, n)
for _, indice := range indices {
r := indice[0]
c := indice[1]
rows[r]++
cols[c]++
}
oddRow := 0
for i := 0; i < m; i++ {
if rows[i]%2 == 1 {
oddRow++
}
}
oddCol := 0
for i := 0; i < n; i++ {
if cols[i]%2 == 1 {
oddCol++
}
}
return oddRow*(n-oddCol) + (m-oddRow)*oddCol
}