在這個問題中,我們透過每輪執行給定的操作將陣列大小減少到 1 或 0。
我們可以在每一輪中對陣列進行排序,以獲得每次迭代中的最大元素。另外,我們還可以使用head資料結構來提高程式碼的效能。
問題陳述 - 我們給了一個 nums[] 陣列。我們需要透過執行以下操作來減少數組。
選擇陣列中兩個最大元素。
如果兩個元素相同,則從陣列中刪除這兩個元素。
如果兩個元素不相同,則從陣列中刪除這兩個元素,並將abs(first − secondary)插入陣列中。
列印陣列的最後一個元素。如果數組為空,則列印 0。
範例
輸入
nums = {5, 9, 8, 3, 2, 5};
輸出
0
說明
在第一輪中,我們取 9 和 8 並將其差值加到陣列中。因此,數組變成 [5, 3, 2, 5, 1]。
在第二輪中,我們取 5 和 5。因此,數組變成 [3, 2, 1]。
下一輪,我們取 3 和 2。因此,數組變成 [1, 1]
在最後一輪中,我們取 1 和 1。因此,數組變成空,我們印出 0。
輸入
nums = {5, 5, 5, 5, 5};
輸出
5
解釋- 我們兩次刪除一對 5,並且有一個 5 保留在陣列中。
輸入
nums = {4, 8, 7, 6};
輸出
1
解釋 - 首先,我們選擇 8 和 7。因此,數組變成 [4, 1, 6]。之後,我們選擇4和6。因此,數組變成[1, 2]。在最後一次操作中,陣列變成[1]。
在這個方法中,我們將遍歷數組,直到數組的大小變成 1 或 0。在每次迭代中,我們將對數組進行排序並對已排序數組的前 2 個元素執行給定的操作。最後,我們將根據數組大小列印輸出。
第 1 步- 將陣列的大小儲存在「len」變數中。
步驟 2- 開始使用 while 迴圈遍歷陣列。
第 3 步- 在迴圈中使用 sort() 方法對陣列進行相反的排序。
第 4 步- 取得陣列的第一個和第二個元素。另外,計算數組的第一個和第二個元素之間的差異。
第 5 步− 如果差值為 0,則刪除陣列的前兩個元素,並將 'len' 減少 2。如果差值不為 0,則刪除前 2 個元素並減少'len' 減 1。
第6步- 最後,如果陣列的大小為0,則傳回0。否則,傳回數組的第一個元素。
#include <bits/stdc++.h> using namespace std; int findLast(vector<int> &nums) { int len = nums.size(); int p = 0; while (len > 1) { // Sort array in reverse order sort(nums.begin(), nums.end(), greater<int>()); // Take the first and second elements of the array int a = nums[0]; int b = nums[1]; // Take the difference between the first and second element int diff = a - b; if (diff == 0) { nums.erase(nums.begin()); nums.erase(nums.begin()); len -= 2; } else { nums.erase(nums.begin()); nums.erase(nums.begin()); nums.push_back(diff); len -= 1; } } // When the size of the array is 0 if (nums.size() == 0) return 0; return nums[0]; } int main() { vector<int> nums = {5, 9, 8, 3, 2, 5}; cout << "The last remaining element after performing the given operations is " << findLast(nums) << "\n"; return 0; }
The last remaining element after performing the given operations is 0
時間複雜度 - O(N*NlogN),其中 O(N) 用於遍歷數組,O(NlogN) 用於在每次迭代中對數組進行排序。
空間複雜度 - O(N) 對陣列進行排序。
在這種方法中,我們將使用優先權佇列,它實作了堆資料結構。它始終按排序順序儲存元素。因此,我們可以輕鬆刪除前 2 個最大元素。
第 1 步- 定義名為優先權佇列的「p_queue」。
步驟 2- 將所有陣列元素插入優先權佇列。
步驟 3- 進行迭代,直到優先權佇列的大小大於 1。
步驟 4- 逐一刪除優先權佇列的前 2 個元素。
第 5 步- 求兩個元素之間的差異。
第6步- 如果差值不為0,則將其推入優先權隊列。
第 7 步− 最後,如果佇列大小為 0,則傳回 0。
第 8 步- 否則,傳回佇列頂端的元素。
#include <bits/stdc++.h> using namespace std; int findLast(vector<int> &nums) { // Defining a priority queue priority_queue<int> p_queue; // Inserting array elements in priority queue for (int p = 0; p < nums.size(); ++p) p_queue.push(nums[p]); // Make iterations while (p_queue.size() > 1) { // Take the first element from queue int first = p_queue.top(); p_queue.pop(); // Get the second element from queue int second = p_queue.top(); p_queue.pop(); // Take the difference of first and second elements int diff = first - second; if (diff != 0) p_queue.push(diff); } // When queue is empty if (p_queue.size() == 0) return 0; // Return the last remaining element return p_queue.top(); } int main() { vector<int> nums = {5, 9, 8, 3, 2, 5}; cout << "The last remaining element after performing the given operations is " << findLast(nums) << "\n"; return 0; }
The last remaining element after performing the given operations is 0
時間複雜度 - 在優先權佇列中插入和刪除元素的時間複雜度為 O(NlogN)。
空間複雜度 - 在優先權佇列中儲存元素的 O(N)。
當我們在插入或刪除任何元素後需要按特定順序排列數組資料時,優先權佇列資料結構總是有用的。它實現了堆資料結構,從而實現了插入和刪除。
以上是透過給定的操作將數組減少到最多一個元素的詳細內容。更多資訊請關注PHP中文網其他相關文章!