簡體   English   中英

給定一個大小的數組NI需要找到將在最小和最大范圍內總和的最小值數

[英]Given an array of size N I need to find the min number of values that will sum up within a min and max range

給定一個大小的數組NI需要找到將在最小和最大范圍內總和的最小值數。

例如:考慮一個數組[1,2,3,4,5]。 我需要從這個數組中找到最小數量的值,其總和大於5且小於8. Ans:因為1 + 5大於5且小於8所以最小值數為2因此答案。

下面是我實現邏輯的函數。

int void CheckValue()
{
 for (i = 0; i <5; i++)
    if (a[i] > min && a[i] < max)
       return 1;
 for (i = 0; i< 4; i++)
     for (j = i + 1; j < 5; j++)
         if (a[i] + a[j] > min && a[i] + a[j] < max)
            return 2;


  for (i = 0; i < 3; i++)
      for (j = i + 1; j < 4; j++)
          for (k = j+1; k < 5; k++)
              if (a[i] + a[j] + a[k] > min && a[i] + a[j] + a[k] < max) 
                 return 3;
  for (i = 0; i < 2; i++)
      for (j = i + 1; j< 3; j++)
          for (k = j + 1; k< 4; k++)
              for (l = k + 1; l < 5; l++)
                  if (a[i] + a[j] + a[k] + a[l] > min && a[i] + a[j] + a[k] + a[l] < max)
                     return 4;
  if(a[0]+a[1]+a[2]+a[3]+a[4]>min && a[0]+a[1]+a[2]+a[3]+a[4]<max)
         return 5;
  return 0;
 }

它工作正常,但問題是它的復雜性。 任何人都可以提供任何建議來進一步優化此代碼或提供更好的邏輯來實現它。

我對這類事情沒有任何經驗,所以很可能有更好的方法,但我確實有一些可能有用的見解。

目前您正在計算每種可能的組合,您應該能夠改變算法以使其能夠消除某些組合,而無需計算它們。

我會先對數組進行排序,這樣可以在不計算數值的情況下消除某些值。

例如,如果你有一個看起來像[1,2,4,5,9]和min = 11和max = 14的數組,那么你的算法將檢查1 + 2,1 + 4,1 + 5,1 + 9然后2 + 4,2 + 5,2 + 9,4 + 5,4 + 9才得到答案。

如果你首先從最高的數字開始,你可以通過計算9 + 1來消除所有可能的1個組合,因為9 + 1 <= 11必須是所有其他可能的1個組合對於兩個數字總和無效的情況,與所有可能的2種組合相同。 如果你在代碼中添加這樣的邏輯,你應該有更少的多余計算,希望能加速你的代碼。

這是一個功課問題嗎?

你的問題真的不明確,但我會這樣:

解決。 nlogn
首先添加第一個元素和最后一個元素。 那是在范圍內嗎? 從一端拿出第一個指針,從開頭開始,將其移動到中間並添加中間數字和最后一個數字,第一個指針+最后一個指針。 是在范圍內? 你可以將第一個指針移動到第一個和最后一個指針之間的中間位置,即:右邊是序列的3/4。

所以你在這里使用二進制搜索,在排序的序列上有兩個指針。

這將為您提供估計的元素數量,這些元素將在范圍內。 我希望你有這個主意。

如果總和超出范圍,則可以將第二個指針移動到中間。

這將給你nlogn

請注意,這僅適用於兩個數字,我不確定您是否要求所有可能的數字添加在范圍內或只有兩個數字?

兩個數字很容易, nlogn做到了

所有可能的子集都是np難的子集和問題。 指數,即2 ** n

我建議以下解決方案:

假設范圍的最小值是minVal,最大值是maxVal。 現在對數組進行排序。讓我們說數組的長度是len對數組中的數字進行二進制搜索只是<= maxVal。

搜索傳遞:我的意思是如果數字在索引i處,那么索引i + 1處的數字應該> = maxVal。 讓我們說這個數字的索引是currIndex。 如果此數字等於maxVal,則在0到currIndex之間進行二進制搜索以獲取數字

minVal和

搜索失敗:這意味着最大數字是數組小於maxVal。 因此,對於這種情況,請按照以下步驟操作:1)將數組中的最大數字添加到結果集中。 2)現在從len-1 t0開始循環1.如果arr [len-1] + arr [len]小於maxVal,則將arr [len-1]添加到結果集並繼續循環。 如果arr [len-1] + arr [len]> maxVal,則跳過並檢查arr [len-1] + arr [len]。

等等。

這是一個相當復雜的問題,可能很難。

我想到的一件事是,它有點類似於“背包問題”。 也許你可以找到它的實現並進行調整。


如果預計最小數量的項目很小,您當然可以使用蠻力方法:

  1. 設置minVal = 1
  2. 找到所有尺寸minVal的集合
  3. 只要沒有一組符合您的標准,請將1添加到minVal並轉到步驟2

我認為你應該考慮對數組進行排序,有很多有效的算法。

然后從最大值開始並按排序順序累加較小值,檢查每一步的條件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM