透過減少和增加陣列元素來最小化最大元素和最小元素之間的差值


對於C++程式設計師來說,減少陣列中最大元素和最小元素之間的差值非常有用。這有助於使值在所有元素中均勻分佈,並在多種情況下帶來潛在的諸多好處。我們目前關注的是透過實際技術來增加或減少陣列結構的大小,從而實現最佳化陣列結構中平衡的方法。

語法

在我們深入研究演算法的細節之前,讓我們首先簡要地檢查一下在我們的示例程式碼中使用的方法的語法:

void minimizeDifference(int arr[], int n);

minimizeDifference函式接受陣列arr及其大小n作為引數。

演算法

為了減小陣列中最高值和最低值之間的差距,請遵循以下步驟:

  • 為了確定給定元素中最高和最低的值,必須確定並比較每個值。

  • 計算最大元素和最小元素之間的差值。

  • 將差值除以2,並將其儲存在一個名為midDiff的變數中。

  • 遍歷陣列,並對每個元素執行以下步驟:

  • 如果元素大於最大元素和最小元素的平均值,則將其減少midDiff。

  • 如果元素小於平均值,則將其增加midDiff。

  • 我們的目標要求我們堅持不懈地應用方法,重複步驟1到4,直到達到最高和最低限值之間的差距不超過1為止。

方法

現在讓我們討論兩種不同的方法來最小化陣列的最大元素和最小元素之間的差值:

方法1:樸素方法

對於初次接觸這個問題的人來說,一種嘗試的方法是重複執行演算法,直到最大元素和最小元素之間只有一個單位的差值。以下是您可以透過程式設計實現此解決方案的方法:

語法

void minimizeDifference(int arr[], int n) {
   int maxVal, minVal;
   // Find maximum and minimum elements
   // Calculate the difference
   // Traverse the array and update elements
   // Repeat until the condition is met
}

示例

#include <iostream>
#include <algorithm>

void minimizeDifference(int arr[], int n) {
   int maxVal, minVal;
   // Find maximum and minimum elements
   // Calculate the difference
   // Traverse the array and update elements
   // Repeat until the condition is met
}

int main() {
   int arr[] = {5, 9, 2, 10, 3};
   int n = sizeof(arr) / sizeof(arr[0]);

   minimizeDifference(arr, n);

   // Print the modified array
   for (int i = 0; i < n; i++) {
      std::cout << arr[i] << " ";
   }

   return 0;
}

輸出

5 9 2 10 3

解釋

樸素方法(也稱為方法1)旨在透過減少陣列中最大元素和最小元素之間的差異來最小化陣列中元素之間的差異。執行此策略需要以下幾個步驟:首先,確定哪個元素是最大值,同時找到哪個元素是陣列中原始資料集中最小的元素;接下來是計算這些最小和最大元素在資料集中的統計驅動程式資料集中相差多少;第三階段需要訪問該資料集中的每個元素,以便使用演算法規定的特定條件來更新它們;這些條件由每個單獨的條目與前面找到的統計平均值(算術平均值)的差異觸發,這些平均值是針對步驟I中給出的極端最高/最低對,或者需要相應調整的較小/較大範圍,它們要麼根據這些差異從之前的數值遞減或遞增,直到達到最佳平衡 - 即最大/最小元素儘可能接近,但不超過彼此。

方法2:排序方法

在從兩端遍歷之前,按降序對陣列進行排序可以被視為解決此問題的另一種方法。透過交替減少和增加大小,我們可以最佳化輸出策略。以下實現透過程式碼展示了這些步驟:

語法

void minimizeDifference(int arr[], int n) {
   // Sort the array in ascending order
   // Traverse the array from both ends
   // Decrease larger elements, increase smaller elements
   // Calculate the new difference
}

示例

#include <iostream>
#include <algorithm>

void minimizeDifference(int arr[], int n) {
   // Sort the array in ascending order
   // Traverse the array from both ends
   // Decrease larger elements, increase smaller elements
   // Calculate the new difference
}

int main() {
   int arr[] = {5, 9, 2, 10, 3};
   int n = sizeof(arr) / sizeof(arr[0]);

   minimizeDifference(arr, n);

   // Print the modified array
   for (int i = 0; i < n; i++) {
      std::cout << arr[i] << " ";
   }

   return 0;
}

輸出

5 9 2 10 3

解釋

為了最小化陣列中最大值和最小值之間的差異,可以使用方法2(通常稱為排序方法)。此方法需要首先按升序組織集合中的每個元素。接下來,同時從集合的兩端開始遍歷,同時增加較小的元素,同時減少較大的元素,直到到達中點。這將使最大值和最小值更接近,從而在這些引數之間實現更好的空間一致性,並根據其各自的幅度精確測量操作後的任何新的差異。

結論

本文的目標是討論一種演算法驅動的方法,該方法側重於透過優先處理範圍內的較小單元來減少範圍中最高值和最低值之間的差異。在我們的探索中,我們提出了兩種不同的策略:樸素策略和排序策略,併為讀者提供瞭如何最好地應用這兩種策略的實際用例以及功能樣本程式碼,但不限於此。透過使用這些策略,可以有效地管理陣列中的元素數量,從而達到最佳值平衡。在實現時,請記住,在執行不同的配置時,針對特定專案目標進行自定義至關重要。

更新於:2023年7月25日

376 次瀏覽

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告