Skip to content

Commit 3d9d716

Browse files
committed
feat: add solutions to lc problem: No.1352
No.1352.Product of the Last K Numbers
1 parent 05b1bb0 commit 3d9d716

File tree

8 files changed

+342
-187
lines changed

8 files changed

+342
-187
lines changed

solution/1300-1399/1351.Count Negative Numbers in a Sorted Matrix/README.md

Lines changed: 51 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -48,15 +48,19 @@
4848

4949
根据**其行列都以非递增顺序排列**的特点,可以从**左下角**开始**往右上方向遍历**
5050

51-
当遇到负数时,说明这一行从当前位置开始往右的所有元素均为负数,那么 `ans += n - j`,并且 i 指针上移;否则 j 指针右移。遍历结束,返回 `ans`
51+
当遇到负数时,说明这一行从当前位置开始往右的所有元素均为负数,我们将答案加上这一行剩余的元素个数,即 $n - j$,并且向上移动一行,即 $i \leftarrow i - 1$。否则,向右移动一列,即 $j \leftarrow j + 1$
5252

53-
时间复杂度:$O(m + n)$。
53+
遍历结束,返回答案。
54+
55+
时间复杂度 $O(m + n)$。其中 $m$ 和 $n$ 分别为矩阵的行数和列数。
5456

5557
**方法二:二分查找**
5658

57-
遍历每一行,查找每一行第一个小于 0 的位置,从该位置开始往右的所有元素均为负数,累加负数个数到 `ans`。遍历结束,返回 `ans`
59+
遍历每一行,二分查找每一行第一个小于 $0$ 的位置,从该位置开始往右的所有元素均为负数,累加负数个数到答案中。
60+
61+
遍历结束,返回答案。
5862

59-
时间复杂度$O(mlogn)$
63+
时间复杂度 $O(m \times \log n)$。其中 $m$ 和 $n$ 分别为矩阵的行数和列数
6064

6165
<!-- tabs:start -->
6266

@@ -82,18 +86,7 @@ class Solution:
8286
```python
8387
class Solution:
8488
def countNegatives(self, grid: List[List[int]]) -> int:
85-
ans = 0
86-
n = len(grid[0])
87-
for row in grid:
88-
left, right = 0, n
89-
while left < right:
90-
mid = (left + right) >> 1
91-
if row[mid] < 0:
92-
right = mid
93-
else:
94-
left = mid + 1
95-
ans += n - left
96-
return ans
89+
return sum(bisect_left(row[::-1], 0) for row in grid)
9790
```
9891

9992
### **Java**
@@ -140,46 +133,6 @@ class Solution {
140133
}
141134
```
142135

143-
### **TypeScript**
144-
145-
```ts
146-
function countNegatives(grid: number[][]): number {
147-
const m = grid.length,
148-
n = grid[0].length;
149-
let ans = 0;
150-
for (let i = m - 1, j = 0; i >= 0 && j < n; ) {
151-
if (grid[i][j] < 0) {
152-
ans += n - j;
153-
--i;
154-
} else {
155-
++j;
156-
}
157-
}
158-
return ans;
159-
}
160-
```
161-
162-
```ts
163-
function countNegatives(grid: number[][]): number {
164-
const n = grid[0].length;
165-
let ans = 0;
166-
for (let row of grid) {
167-
let left = 0,
168-
right = n;
169-
while (left < right) {
170-
const mid = (left + right) >> 1;
171-
if (row[mid] < 0) {
172-
right = mid;
173-
} else {
174-
left = mid + 1;
175-
}
176-
}
177-
ans += n - left;
178-
}
179-
return ans;
180-
}
181-
```
182-
183136
### **C++**
184137

185138
```cpp
@@ -205,17 +158,8 @@ class Solution {
205158
public:
206159
int countNegatives(vector<vector<int>>& grid) {
207160
int ans = 0;
208-
int n = grid[0].size();
209-
for (auto& row : grid)
210-
{
211-
int left = 0, right = n;
212-
while (left < right)
213-
{
214-
int mid = (left + right) >> 1;
215-
if (row[mid] < 0) right = mid;
216-
else left = mid + 1;
217-
}
218-
ans += n - left;
161+
for (auto& row : grid) {
162+
ans += lower_bound(row.rbegin(), row.rend(), 0) - row.rbegin();
219163
}
220164
return ans;
221165
}
@@ -259,6 +203,46 @@ func countNegatives(grid [][]int) int {
259203
}
260204
```
261205

206+
### **TypeScript**
207+
208+
```ts
209+
function countNegatives(grid: number[][]): number {
210+
const m = grid.length,
211+
n = grid[0].length;
212+
let ans = 0;
213+
for (let i = m - 1, j = 0; i >= 0 && j < n; ) {
214+
if (grid[i][j] < 0) {
215+
ans += n - j;
216+
--i;
217+
} else {
218+
++j;
219+
}
220+
}
221+
return ans;
222+
}
223+
```
224+
225+
```ts
226+
function countNegatives(grid: number[][]): number {
227+
const n = grid[0].length;
228+
let ans = 0;
229+
for (let row of grid) {
230+
let left = 0,
231+
right = n;
232+
while (left < right) {
233+
const mid = (left + right) >> 1;
234+
if (row[mid] < 0) {
235+
right = mid;
236+
} else {
237+
left = mid + 1;
238+
}
239+
}
240+
ans += n - left;
241+
}
242+
return ans;
243+
}
244+
```
245+
262246
### **JavaScript**
263247

264248
```js

solution/1300-1399/1351.Count Negative Numbers in a Sorted Matrix/README_EN.md

Lines changed: 43 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -59,18 +59,7 @@ class Solution:
5959
```python
6060
class Solution:
6161
def countNegatives(self, grid: List[List[int]]) -> int:
62-
ans = 0
63-
n = len(grid[0])
64-
for row in grid:
65-
left, right = 0, n
66-
while left < right:
67-
mid = (left + right) >> 1
68-
if row[mid] < 0:
69-
right = mid
70-
else:
71-
left = mid + 1
72-
ans += n - left
73-
return ans
62+
return sum(bisect_left(row[::-1], 0) for row in grid)
7463
```
7564

7665
### **Java**
@@ -115,46 +104,6 @@ class Solution {
115104
}
116105
```
117106

118-
### **TypeScript**
119-
120-
```ts
121-
function countNegatives(grid: number[][]): number {
122-
const m = grid.length,
123-
n = grid[0].length;
124-
let ans = 0;
125-
for (let i = m - 1, j = 0; i >= 0 && j < n; ) {
126-
if (grid[i][j] < 0) {
127-
ans += n - j;
128-
--i;
129-
} else {
130-
++j;
131-
}
132-
}
133-
return ans;
134-
}
135-
```
136-
137-
```ts
138-
function countNegatives(grid: number[][]): number {
139-
const n = grid[0].length;
140-
let ans = 0;
141-
for (let row of grid) {
142-
let left = 0,
143-
right = n;
144-
while (left < right) {
145-
const mid = (left + right) >> 1;
146-
if (row[mid] < 0) {
147-
right = mid;
148-
} else {
149-
left = mid + 1;
150-
}
151-
}
152-
ans += n - left;
153-
}
154-
return ans;
155-
}
156-
```
157-
158107
### **C++**
159108

160109
```cpp
@@ -180,17 +129,8 @@ class Solution {
180129
public:
181130
int countNegatives(vector<vector<int>>& grid) {
182131
int ans = 0;
183-
int n = grid[0].size();
184-
for (auto& row : grid)
185-
{
186-
int left = 0, right = n;
187-
while (left < right)
188-
{
189-
int mid = (left + right) >> 1;
190-
if (row[mid] < 0) right = mid;
191-
else left = mid + 1;
192-
}
193-
ans += n - left;
132+
for (auto& row : grid) {
133+
ans += lower_bound(row.rbegin(), row.rend(), 0) - row.rbegin();
194134
}
195135
return ans;
196136
}
@@ -234,6 +174,46 @@ func countNegatives(grid [][]int) int {
234174
}
235175
```
236176

177+
### **TypeScript**
178+
179+
```ts
180+
function countNegatives(grid: number[][]): number {
181+
const m = grid.length,
182+
n = grid[0].length;
183+
let ans = 0;
184+
for (let i = m - 1, j = 0; i >= 0 && j < n; ) {
185+
if (grid[i][j] < 0) {
186+
ans += n - j;
187+
--i;
188+
} else {
189+
++j;
190+
}
191+
}
192+
return ans;
193+
}
194+
```
195+
196+
```ts
197+
function countNegatives(grid: number[][]): number {
198+
const n = grid[0].length;
199+
let ans = 0;
200+
for (let row of grid) {
201+
let left = 0,
202+
right = n;
203+
while (left < right) {
204+
const mid = (left + right) >> 1;
205+
if (row[mid] < 0) {
206+
right = mid;
207+
} else {
208+
left = mid + 1;
209+
}
210+
}
211+
ans += n - left;
212+
}
213+
return ans;
214+
}
215+
```
216+
237217
### **JavaScript**
238218

239219
```js

0 commit comments

Comments
 (0)