首頁  >  文章  >  後端開發  >  透過給定的操作將數組減少到最多一個元素

透過給定的操作將數組減少到最多一個元素

WBOY
WBOY轉載
2023-08-29 14:25:10623瀏覽

透過給定的操作將數組減少到最多一個元素

在這個問題中,我們透過每輪執行給定的操作將陣列大小減少到 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

在這個方法中,我們將遍歷數組,直到數組的大小變成 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

在這種方法中,我們將使用優先權佇列,它實作了堆資料結構。它始終按排序順序儲存元素。因此,我們可以輕鬆刪除前 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中文網其他相關文章!

陳述:
本文轉載於:tutorialspoint.com。如有侵權,請聯絡admin@php.cn刪除