本文主要是介绍LeetCode:1686. 石子游戏 VI(贪心 Java),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
1686. 石子游戏 VI
题目描述:
实现代码与解析:
贪心
原理思路:
1686. 石子游戏 VI
题目描述:
Alice 和 Bob 轮流玩一个游戏,Alice 先手。
一堆石子里总共有 n
个石子,轮到某个玩家时,他可以 移出 一个石子并得到这个石子的价值。Alice 和 Bob 对石子价值有 不一样的的评判标准 。双方都知道对方的评判标准。
给你两个长度为 n
的整数数组 aliceValues
和 bobValues
。aliceValues[i]
和 bobValues[i]
分别表示 Alice 和 Bob 认为第 i
个石子的价值。
所有石子都被取完后,得分较高的人为胜者。如果两个玩家得分相同,那么为平局。两位玩家都会采用 最优策略 进行游戏。
请你推断游戏的结果,用如下的方式表示:
- 如果 Alice 赢,返回
1
。 - 如果 Bob 赢,返回
-1
。 - 如果游戏平局,返回
0
。
示例 1:
输入:aliceValues = [1,3], bobValues = [2,1] 输出:1 解释: 如果 Alice 拿石子 1 (下标从 0开始),那么 Alice 可以得到 3 分。 Bob 只能选择石子 0 ,得到 2 分。 Alice 获胜。
示例 2:
输入:aliceValues = [1,2], bobValues = [3,1] 输出:0 解释: Alice 拿石子 0 , Bob 拿石子 1 ,他们得分都为 1 分。 打平。
示例 3:
输入:aliceValues = [2,4,3], bobValues = [1,6,7] 输出:-1 解释: 不管 Alice 怎么操作,Bob 都可以得到比 Alice 更高的得分。 比方说,Alice 拿石子 1 ,Bob 拿石子 2 , Alice 拿石子 0 ,Alice 会得到 6 分而 Bob 得分为 7 分。 Bob 会获胜。
实现代码与解析:
贪心
class Solution {public int stoneGameVI(int[] aliceValues, int[] bobValues) {int n = aliceValues.length;Integer[] idx = new Integer[n];// 初始化for (int i = 0; i < n; i++) {idx[i] = i;}Arrays.sort(idx, (a, b) -> (aliceValues[b] + bobValues[b]) - (aliceValues[a] + bobValues[a]));// 将下标按两数组和排序,降序int sum1 = 0;int sum2 = 0;for (int i = 0; i < n; i++) {if (i % 2 == 0) sum1 += aliceValues[idx[i]];else sum2 += bobValues[idx[i]];}if (sum1 > sum2) return 1;else if (sum1 < sum2) return -1;else return 0;}
}
原理思路:
贪心策略:每个人选择当前还存在的,两人对此石子价值大小和最大的。
因为两人互相知道对方对于石头价值大小的判断,不能只考虑自己的总如何最大,而是要考虑如何选可以不仅让自己价值总和变大,还会让对方可以获得的价值总和变小。
也就是说,你每次选的,不光是石头价值大,而且要让对方亏,对方亏的就等于你赚的,所以你总共赚的就是对应石子两人对其价值的总和,每次选最大就即可。
最后比较两人石头价值,判断返回即可。
这篇关于LeetCode:1686. 石子游戏 VI(贪心 Java)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!