1686. Stone Game VI
T: O(nlogn)
S: O(n)
```java
class Solution {
class Value {
int sum;
int index;
Value(int sum, int index) {
this.sum = sum;
this.index = index;
}
}
public int stoneGameVI(int[] aliceValues, int[] bobValues) {
int n = aliceValues.length;
List<Value> sum = new ArrayList<>();
for (int i = 0; i < n; i++) {
sum.add(new Value(aliceValues[i] + bobValues[i], i));
}
Collections.sort(sum, (a, b) -> b.sum - a.sum);
int alicePoints = 0;
int bobPoints = 0;
for (int i = 0; i < n; i++) {
int index = sum.get(i).index;
if (i % 2 == 0) {
alicePoints += aliceValues[index];
} else {
bobPoints += bobValues[index];
}
}
if (alicePoints == bobPoints) {
return 0;
}
return alicePoints > bobPoints ? 1 : -1;
}
}
/**
從 ex2 可以觀察到, 不是取自身最大的開始, 就可以獲勝
ex2 a= [1,2] b=[3,1]
若 a 取 2, b 就可以取 3 -> b贏
其實最佳解是 a 取 1, b只能取 1 -> 平手
所以想要找到對 a 最好的選擇, 不能只貪心的看 a 的最大
還得考慮到 b 的值
如何考慮到 b 的值呢? 那就是相加
相加後可以看到 變成: [4, 3]
如此就可以發現 當 a 選 1 時, 還讓 b 錯失了+3 的機會也就可以說是 a+3 ! 所以 a 的收益就會變相是 4!
所以優先選 a 的 index 0 是比較好的
T: O(nlogn)
S: O(n)
*/
```
Last updated