Skip to content

Commit 405997a

Browse files
committed
dev
1 parent 6293eae commit 405997a

7 files changed

Lines changed: 199 additions & 71 deletions

File tree

src/main/java/org/gd/common/Commons.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ public static boolean isPowerOfTwo(long n) {
306306
}
307307

308308
public static int digitsCount(int num) {
309-
return num == 0 ? 1 : (int) (Math.log10(Math.abs(num)) + 1);
309+
return num == 0 ? 1 : (int) (Math.log10(Math.abs(num)) + (num < 0 ? 2 : 1));
310310
}
311311

312312
public static int maxDigitsCount(int[] arr) {
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package org.gd.leetcode.p0741;
2+
3+
public class BlockPoint implements Point {
4+
5+
static final org.gd.leetcode.p0741.BlockPoint INSTANCE = new org.gd.leetcode.p0741.BlockPoint();
6+
7+
private BlockPoint() {}
8+
9+
@Override
10+
public int value() { return -1; }
11+
12+
@Override
13+
public int pathSum() {
14+
throw new UnsupportedOperationException(new String(new char[]{175, 92, 95, 40, 12_484, 41, 95, 47, 175}));
15+
}
16+
17+
@Override
18+
public boolean isBlock() { return true; }
19+
20+
@Override
21+
public boolean isValid() { return false; }
22+
23+
@Override
24+
public void addPrev(Point prev) {
25+
throw new UnsupportedOperationException(new String(new char[]{175, 92, 95, 40, 12_484, 41, 95, 47, 175}));
26+
}
27+
28+
@Override
29+
public void reset() {}
30+
31+
@Override
32+
public void erase() {}
33+
34+
@Override
35+
public String path() { return ""; }
36+
37+
@Override
38+
public String toString() { return "(block)"; }
39+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.gd.leetcode.p0741;
2+
3+
interface Point {
4+
5+
static Point of(int row, int col, int value) {
6+
return value == -1 ? BlockPoint.INSTANCE : new PointImpl(row, col, value);
7+
}
8+
9+
int value();
10+
11+
int pathSum();
12+
13+
boolean isBlock();
14+
15+
boolean isValid();
16+
17+
void addPrev(Point prev);
18+
19+
void reset();
20+
21+
void erase();
22+
23+
String path();
24+
25+
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package org.gd.leetcode.p0741;
2+
3+
public class PointImpl implements Point {
4+
5+
private final int row, col;
6+
7+
private int value;
8+
private int sum;
9+
private Point prev;
10+
private Boolean valid;
11+
12+
PointImpl(int row, int col, int value) {
13+
this.row = row;
14+
this.col = col;
15+
this.value = value;
16+
sum = value;
17+
}
18+
19+
@Override
20+
public int value() { return value; }
21+
22+
@Override
23+
public int pathSum() { return sum; }
24+
25+
@Override
26+
public boolean isBlock() { return false; }
27+
28+
@Override
29+
public boolean isValid() {
30+
if (valid != null)
31+
return valid;
32+
33+
if (row == 0 && col == 0)
34+
return valid = true;
35+
36+
if (prev != null)
37+
return valid = prev.isValid();
38+
39+
return valid = false;
40+
}
41+
42+
@Override
43+
public void addPrev(Point prev) {
44+
if (prev.isBlock()) return;
45+
reset();
46+
this.prev = prev;
47+
sum += prev.pathSum();
48+
isValid();
49+
}
50+
51+
@Override
52+
public void reset() {
53+
sum = value;
54+
if (prev != null) {
55+
prev.reset();
56+
prev = null;
57+
}
58+
}
59+
60+
@Override
61+
public void erase() {
62+
value = 0;
63+
sum = 0;
64+
if (prev != null) {
65+
prev.erase();
66+
prev = null;
67+
}
68+
}
69+
70+
@Override
71+
public String path() {
72+
String s = String.format("(%d;%d)", row, col);
73+
if (prev != null)
74+
s = String.format("%s->%s", prev.path(), s);
75+
return s;
76+
}
77+
78+
@Override
79+
public String toString() { return "" + value; }
80+
}

src/main/java/org/gd/leetcode/p0741/SimplePoint.java

Lines changed: 0 additions & 40 deletions
This file was deleted.

src/main/java/org/gd/leetcode/p0741/Solution.java

Lines changed: 34 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,22 @@
1616
)
1717
class Solution {
1818

19-
private SimplePoint[][] grid;
19+
private Point[][] grid;
2020
private int rows, cols;
2121

2222
private void reset(int[][] grid) {
2323
rows = grid.length;
2424
cols = grid[0].length;
25-
this.grid = new SimplePoint[rows][cols];
25+
this.grid = new Point[rows][cols];
2626
for (int row = 0; row < rows; row++) {
2727
for (int col = 0; col < cols; col++) {
28-
this.grid[row][col] = new SimplePoint(grid[row][col]);
28+
this.grid[row][col] = Point.of(row, col, grid[row][col]);
2929
}
3030
}
3131
}
3232

3333
private int forward() {
34+
3435
for (int row = 1; row < rows && !grid[row][0].isBlock(); row++)
3536
grid[row][0].addPrev(grid[row - 1][0]);
3637

@@ -43,12 +44,13 @@ private int forward() {
4344
if (grid[row][col].isBlock())
4445
continue;
4546

46-
final SimplePoint up = grid[row - 1][col];
47-
final SimplePoint left = grid[row][col - 1];
47+
final Point up = grid[row - 1][col];
48+
final Point left = grid[row][col - 1];
4849

4950
if (up.isBlock()) {
50-
if (!left.isBlock())
51+
if (!left.isBlock()) {
5152
grid[row][col].addPrev(left);
53+
}
5254
} else if (left.isBlock()) {
5355
grid[row][col].addPrev(up);
5456
} else if (up.value() > left.value()) {
@@ -59,53 +61,57 @@ private int forward() {
5961
}
6062
}
6163

62-
SimplePoint point = grid[rows - 1][cols - 1];
63-
int value = point.pathSum();
64-
point.resetAll();
65-
return value;
64+
Point point = grid[rows - 1][cols - 1];
65+
if (point.isValid()) {
66+
int value = point.pathSum();
67+
point.erase();
68+
return value;
69+
}
70+
71+
return -1;
6672
}
6773

6874
private int backward() {
6975

70-
for (int row = rows - 2; row >= 0 && !grid[row][0].isBlock(); row--)
71-
grid[row][0].addPrev(grid[row + 1][0]);
76+
for (int row = rows - 2; row >= 0 && !grid[row][cols - 1].isBlock(); row--)
77+
grid[row][cols - 1].addPrev(grid[row + 1][cols - 1]);
7278

73-
for (int col = cols - 2; col >= 0 && !grid[0][col].isBlock(); col--)
74-
grid[0][col].addPrev(grid[0][col + 1]);
79+
for (int col = cols - 2; col >= 0 && !grid[rows - 1][col].isBlock(); col--)
80+
grid[rows - 1][col].addPrev(grid[rows - 1][col + 1]);
7581

7682
for (int row = rows - 2; row >= 0; row--) {
7783
for (int col = cols - 2; col >= 0; col--) {
78-
if (grid[row][col].isBlock())
84+
Point current = grid[row][col];
85+
current.reset();
86+
if (current.isBlock())
7987
continue;
8088

81-
SimplePoint right = grid[row][col + 1];
82-
SimplePoint down = grid[row + 1][col];
89+
Point right = grid[row][col + 1];
90+
Point down = grid[row + 1][col];
8391
if (right.isBlock()) {
8492
if (!down.isBlock())
85-
grid[row][col].addPrev(down);
93+
current.addPrev(down);
8694
} else if (down.isBlock()) {
87-
grid[row][col].addPrev(right);
95+
current.addPrev(right);
8896
} else if (right.value() > down.value()) {
89-
grid[row][col].addPrev(right);
97+
current.addPrev(right);
9098
} else {
91-
grid[row][col].addPrev(down);
99+
current.addPrev(down);
92100
}
93101
}
94102
}
95103

96-
SimplePoint point = grid[0][0];
97-
int value = point.pathSum();
98-
point.resetAll();
99-
return value;
104+
return grid[0][0].pathSum();
100105
}
101106

102107
public int cherryPickup(int[][] intsGrid) {
103108
reset(intsGrid);
104109

105-
int forward = forward();
106-
int backward = backward();
110+
final int forward = forward();
111+
if (forward == -1)
112+
return 0;
107113

108-
return forward + backward;
114+
return forward + backward();
109115
}
110116

111117
}

src/test/java/org/gd/leetcode/p0741/SolutionTest.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.junit.jupiter.params.provider.Arguments;
66
import org.junit.jupiter.params.provider.MethodSource;
77

8+
import java.util.List;
89
import java.util.stream.Stream;
910

1011
import static org.junit.jupiter.api.Assertions.*;
@@ -15,14 +16,31 @@
1516
* @author Horkhover D.
1617
* @since 2020-07-16.07.2020
1718
*/
19+
@DisplayName("LeetCode #741: Cherry Pickup")
1820
class SolutionTest {
1921

20-
private static Stream<Arguments> args() {
21-
return Stream.of(
22+
private static List<Arguments> args() {
23+
return List.of(
24+
25+
Arguments.of(new int[][]{
26+
{1, 1, 1, 1, 0, 0, 0},
27+
{0, 0, 0, 1, 0, 0, 0},
28+
{0, 0, 0, 1, 0, 0, 1},
29+
{1, 0, 0, 1, 0, 0, 0},
30+
{0, 0, 0, 1, 0, 0, 0},
31+
{0, 0, 0, 1, 0, 0, 0},
32+
{0, 0, 0, 1, 1, 1, 1}}, 15),
33+
34+
Arguments.of(new int[][]{
35+
{1, 1, -1},
36+
{1, -1, 1},
37+
{-1, 1, 1}}, 0),
38+
2239
Arguments.of(new int[][]{
2340
{0, 1, -1},
2441
{1, 0, -1},
2542
{1, 1, 1}}, 5),
43+
2644
Arguments.of(new int[][]{
2745
{0, 1, -1, 1},
2846
{1, 0, -1, 1},

0 commit comments

Comments
 (0)