2
public int maxTotalFruits(int[][] fruits, int startPos, int k) {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);9
if (startPos > posOfLastFruit) {10
int diff = startPos - posOfLastFruit;11
startPos = posOfLastFruit;13
if (k == 0) return fruits[posOfLastFruit][1];14
else if (k < 0) return 0;17
for (int i = 0; i < n; i++) {18
prefixArr[fruits[i][0]] = fruits[i][1];22
for (int i = startPos - 1; i >= start; i--) {28
for (int i = startPos + 1; i <= end; i++) {33
int minimum = prefixArr[startPos];34
prefixArr[startPos] = 0;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;43
if (endIndex > startPos && endIndex < prefixArr.length) {44
maxCurrPossible += prefixArr[endIndex];45
} else if (endIndex >= prefixArr.length) {46
maxCurrPossible += prefixArr[prefixArr.length - 1];49
ans = Math.max(ans, maxCurrPossible);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;58
if (endIndex < startPos && endIndex >= 0) {59
maxCurrPossible += prefixArr[endIndex];60
} else if (endIndex < 0) {61
maxCurrPossible += prefixArr[0];64
ans = Math.max(ans, maxCurrPossible);