Maximum Fruits Harvested After at Most K Steps LeetCode solution in Java

1
class Solution {
2
public int maxTotalFruits(int[][] fruits, int startPos, int k) {
3
int n = fruits.length;
4
int posOfLastFruit = fruits[n - 1][0];
5
int prefixArr[] = new int[posOfLastFruit + 1];
6
int start = Math.max(startPos - k, 0);
7
int end = Math.min(startPos + k, prefixArr.length - 1);
8

9
if (startPos > posOfLastFruit) {
10
int diff = startPos - posOfLastFruit;
11
startPos = posOfLastFruit;
12
k = k - diff;
13
if (k == 0) return fruits[posOfLastFruit][1];
14
else if (k < 0) return 0;
15
}
16

17
for (int i = 0; i < n; i++) {
18
prefixArr[fruits[i][0]] = fruits[i][1];
19
}
20

21
int curr = 0;
22
for (int i = startPos - 1; i >= start; i--) {
23
curr += prefixArr[i];
24
prefixArr[i] = curr;
25
}
26

27
curr = 0;
28
for (int i = startPos + 1; i <= end; i++) {
29
curr += prefixArr[i];
30
prefixArr[i] = curr;
31
}
32

33
int minimum = prefixArr[startPos];
34
prefixArr[startPos] = 0;
35
int ans = 0;
36

37
for (int i = start; i < startPos; i++) {
38
int maxCurrPossible = prefixArr[i];
39
int stepsAlreadyWalked = startPos - i;
40
int stepsRemaining = k - stepsAlreadyWalked;
41
int endIndex = i + stepsRemaining;
42

43
if (endIndex > startPos && endIndex < prefixArr.length) {
44
maxCurrPossible += prefixArr[endIndex];
45
} else if (endIndex >= prefixArr.length) {
46
maxCurrPossible += prefixArr[prefixArr.length - 1];
47
}
48

49
ans = Math.max(ans, maxCurrPossible);
50
}
51

52
for (int i = startPos + 1; i <= end; i++) {
53
int maxCurrPossible = prefixArr[i];
54
int stepsAlreadyWalked = i - startPos;
55
int stepsRemaining = k - stepsAlreadyWalked;
56
int endIndex = i - stepsRemaining;
57

58
if (endIndex < startPos && endIndex >= 0) {
59
maxCurrPossible += prefixArr[endIndex];
60
} else if (endIndex < 0) {
61
maxCurrPossible += prefixArr[0];
62
}
63

64
ans = Math.max(ans, maxCurrPossible);
65
}
66

67
return ans + minimum;
68
}
69
}

0

WPM •0 •0

100%

ACC •0 •0

0s

TIME •0