|
…
|
||
|---|---|---|
| .. | ||
| README.md | ||
| README_EN.md | ||
| Solution.cpp | ||
| Solution.go | ||
| Solution.java | ||
| Solution.py | ||
| Solution.rs | ||
| Solution.ts | ||
| Solution2.cpp | ||
| Solution2.go | ||
| Solution2.java | ||
| Solution2.py | ||
| Solution2.rs | ||
| Solution2.ts | ||
README_EN.md
| comments | difficulty | edit_url | rating | source | tags | ||||
|---|---|---|---|---|---|---|---|---|---|
| true | Easy | https://github.com/doocs/leetcode/edit/main/solution/2900-2999/2974.Minimum%20Number%20Game/README_EN.md | 1184 | Weekly Contest 377 Q1 |
|
2974. Minimum Number Game
Description
You are given a 0-indexed integer array nums of even length and there is also an empty array arr. Alice and Bob decided to play a game where in every round Alice and Bob will do one move. The rules of the game are as follows:
- Every round, first Alice will remove the minimum element from
nums, and then Bob does the same. - Now, first Bob will append the removed element in the array
arr, and then Alice does the same. - The game continues until
numsbecomes empty.
Return the resulting array arr.
Example 1:
Input: nums = [5,4,2,3] Output: [3,2,5,4] Explanation: In round one, first Alice removes 2 and then Bob removes 3. Then in arr firstly Bob appends 3 and then Alice appends 2. So arr = [3,2]. At the begining of round two, nums = [5,4]. Now, first Alice removes 4 and then Bob removes 5. Then both append in arr which becomes [3,2,5,4].
Example 2:
Input: nums = [2,5] Output: [5,2] Explanation: In round one, first Alice removes 2 and then Bob removes 5. Then in arr firstly Bob appends and then Alice appends. So arr = [5,2].
Constraints:
2 <= nums.length <= 1001 <= nums[i] <= 100nums.length % 2 == 0
Solutions
Solution 1: Simulation + Priority Queue (Min Heap)
We can put the elements of the array \textit{nums} into a min heap one by one. Each time, we take out two elements a and b from the min heap, and then sequentially put b and a into the answer array until the min heap is empty.
The time complexity is O(n \times \log n), and the space complexity is O(n). Here, n is the length of the array \textit{nums}.
Python3
class Solution:
def numberGame(self, nums: List[int]) -> List[int]:
heapify(nums)
ans = []
while nums:
a, b = heappop(nums), heappop(nums)
ans.append(b)
ans.append(a)
return ans
Java
class Solution {
public int[] numberGame(int[] nums) {
PriorityQueue<Integer> pq = new PriorityQueue<>();
for (int x : nums) {
pq.offer(x);
}
int[] ans = new int[nums.length];
int i = 0;
while (!pq.isEmpty()) {
int a = pq.poll();
ans[i++] = pq.poll();
ans[i++] = a;
}
return ans;
}
}
C++
class Solution {
public:
vector<int> numberGame(vector<int>& nums) {
priority_queue<int, vector<int>, greater<int>> pq;
for (int x : nums) {
pq.push(x);
}
vector<int> ans;
while (pq.size()) {
int a = pq.top();
pq.pop();
int b = pq.top();
pq.pop();
ans.push_back(b);
ans.push_back(a);
}
return ans;
}
};
Go
func numberGame(nums []int) (ans []int) {
pq := &hp{nums}
heap.Init(pq)
for pq.Len() > 0 {
a := heap.Pop(pq).(int)
b := heap.Pop(pq).(int)
ans = append(ans, b)
ans = append(ans, a)
}
return
}
type hp struct{ sort.IntSlice }
func (h *hp) Less(i, j int) bool { return h.IntSlice[i] < h.IntSlice[j] }
func (h *hp) Pop() interface{} {
old := h.IntSlice
n := len(old)
x := old[n-1]
h.IntSlice = old[0 : n-1]
return x
}
func (h *hp) Push(x interface{}) {
h.IntSlice = append(h.IntSlice, x.(int))
}
TypeScript
function numberGame(nums: number[]): number[] {
const pq = new MinPriorityQueue();
for (const x of nums) {
pq.enqueue(x);
}
const ans: number[] = [];
while (pq.size()) {
const a = pq.dequeue().element;
const b = pq.dequeue().element;
ans.push(b, a);
}
return ans;
}
Rust
use std::cmp::Reverse;
use std::collections::BinaryHeap;
impl Solution {
pub fn number_game(nums: Vec<i32>) -> Vec<i32> {
let mut pq = BinaryHeap::new();
for &x in &nums {
pq.push(Reverse(x));
}
let mut ans = Vec::new();
while let Some(Reverse(a)) = pq.pop() {
if let Some(Reverse(b)) = pq.pop() {
ans.push(b);
ans.push(a);
}
}
ans
}
}
Solution 2: Sorting + Swapping
We can sort the array \textit{nums}, and then iterate through the array, swapping adjacent elements each time until the iteration is complete, and return the swapped array.
The time complexity is O(n \log n), and the space complexity is O(\log n). Here, n is the length of the array \textit{nums}.
Python3
class Solution:
def numberGame(self, nums: List[int]) -> List[int]:
nums.sort()
for i in range(0, len(nums), 2):
nums[i], nums[i + 1] = nums[i + 1], nums[i]
return nums
Java
class Solution {
public int[] numberGame(int[] nums) {
Arrays.sort(nums);
for (int i = 0; i < nums.length; i += 2) {
int t = nums[i];
nums[i] = nums[i + 1];
nums[i + 1] = t;
}
return nums;
}
}
C++
class Solution {
public:
vector<int> numberGame(vector<int>& nums) {
sort(nums.begin(), nums.end());
int n = nums.size();
for (int i = 0; i < n; i += 2) {
swap(nums[i], nums[i + 1]);
}
return nums;
}
};
Go
func numberGame(nums []int) []int {
sort.Ints(nums)
for i := 0; i < len(nums); i += 2 {
nums[i], nums[i+1] = nums[i+1], nums[i]
}
return nums
}
TypeScript
function numberGame(nums: number[]): number[] {
nums.sort((a, b) => a - b);
for (let i = 0; i < nums.length; i += 2) {
[nums[i], nums[i + 1]] = [nums[i + 1], nums[i]];
}
return nums;
}
Rust
impl Solution {
pub fn number_game(nums: Vec<i32>) -> Vec<i32> {
let mut nums = nums;
nums.sort_unstable();
for i in (0..nums.len()).step_by(2) {
nums.swap(i, i + 1);
}
nums
}
}