极大极小游戏【LC2293】
You are given a 0-indexed integer array
numswhose length is a power of2.Apply the following algorithm on
nums:
- Let
nbe the length ofnums. Ifn == 1, end the process. Otherwise, create a new 0-indexed integer arraynewNumsof lengthn / 2.- For every even index
iwhere0 <= i < n / 2, assign the value ofnewNums[i]asmin(nums[2 * i], nums[2 * i + 1]).- For every odd index
iwhere0 <= i < n / 2, assign the value ofnewNums[i]asmax(nums[2 * i], nums[2 * i + 1]).- Replace the array
numswithnewNums.- Repeat the entire process starting from step 1.
Return the last number that remains in
numsafter applying the algorithm.
小年快乐~ 周赛在周六周日永远搞不清 周赛在周日周赛在周日周赛在周日
队列
-
思路:使用队列存放需要迭代的数组元素,并记录下标序号iii,根据下标奇偶性取最大值最小值,每处理一组元素,序号加1,直至队列中只存在一个元素,返回即可。
- 由于数组长度均为2n2^n2n,迭代过程中长度一直为偶数直至长度为1,因此下标序号可以累计
-
实现
class Solution { public int minMaxGame(int[] nums) { Deque<Integer> deque = new LinkedList<>(); for (int num : nums){ deque.addLast(num); } int i = 0; while (deque.size() > 1){ if ((i & 1) == 0){ deque.addLast(Math.min(deque.pollFirst(),deque.pollFirst())); }else{ deque.addLast(Math.max(deque.pollFirst(),deque.pollFirst())); } i++; } return deque.pollFirst(); } }- 复杂度
- 时间复杂度:O(n)O(n)O(n)
- 空间复杂度:O(n)O(n)O(n)
- 复杂度
构建数组
-
思路:构建新数组
-
实现
class Solution { public int minMaxGame(int[] nums) { int n = nums.length; while (n != 1) { int[] newNums = new int[n / 2]; for (int i = 0; i < newNums.length; i++) { if (i % 2 == 0) { newNums[i] = Math.min(nums[2 * i], nums[2 * i + 1]); } else { newNums[i] = Math.max(nums[2 * i], nums[2 * i + 1]); } } nums = newNums; n /= 2; } return nums[0]; } } 作者:力扣官方题解 链接:https://leetcode.cn/problems/min-max-game/solutions/2061544/ji-da-ji-xiao-you-xi-by-leetcode-solutio-ucpt/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。- 复杂度
- 时间复杂度:O(n)O(n)O(n)
- 空间复杂度:O(n)O(n)O(n)
- 复杂度
递归
-
思路:若数组长度为1,那么返回
nums[0],否则,按照题意求出新数组,递归求解新数组的答案 -
实现
class Solution { public int minMaxGame(int[] nums) { int n = nums.length; if (n == 1) { return nums[0]; } int[] newNums = new int[n / 2]; for (int i = 0; i < newNums.length; i++) { if (i % 2 == 0) { newNums[i] = Math.min(nums[2 * i], nums[2 * i + 1]); } else { newNums[i] = Math.max(nums[2 * i], nums[2 * i + 1]); } } return minMaxGame(newNums); } } 作者:力扣官方题解 链接:https://leetcode.cn/problems/min-max-game/solutions/2061544/ji-da-ji-xiao-you-xi-by-leetcode-solutio-ucpt/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。- 复杂度
- 时间复杂度:O(n)O(n)O(n)
- 空间复杂度:O(n)O(n)O(n)
- 复杂度
原地修改
-
思路:数组中的元素被使用过就不再被使用,因此可以将第iii对计算得到的结果,存储至nums[i]nums[i]nums[i]
-
实现
class Solution { public int minMaxGame(int[] nums) { int n = nums.length; while (n > 1){ for (int i = 0; i < n / 2; i++){ if (i % 2 == 0){ nums[i] = Math.min(nums[i * 2], nums[i * 2 + 1]); }else{ nums[i] = Math.max(nums[i * 2], nums[i * 2 + 1]); } } n /= 2; } return nums[0]; } }- 复杂度
- 时间复杂度:O(n)O(n)O(n)
- 空间复杂度:O(1)O(1)O(1)
- 复杂度

文章介绍了如何解决LeetCode上的2293号问题——极小极大游戏。给定一个长度为2的幂的整数数组,应用一个算法来更新数组,每次将相邻元素两两比较,根据下标奇偶性选择最小值或最大值放入新数组。最后返回数组中剩下的唯一数字。文章提供了四种解决方案,包括使用队列、构建新数组、递归和原地修改,所有方法的时间复杂度和空间复杂度均为O(n)。
3043

被折叠的 条评论
为什么被折叠?



