2017-10-26 9 views
0

[Image of the actual problem]最小差分配列要素含む配列を取得する方法を

我々が選択すべき項目があるINPUT3に基づいて最適なアイテム/アイテムを選択する必要があります。私たちは常に最大の項目を取らないように選択する必要があります。代わりに、私たちはあまり差がないアイテムを取る。

input1: total items 
input2: array of items 
input3: items to be selected 

Scenario 1: 
input: 6, {44,55,605,100,154,190}, 1 
output should be: {605} 

input: 5, {15,85,32,31,2}, 2 
output should be: {32,31} 

私たちは選択する項目の数を増やすので、出力には最小の差異で選択された項目が増えます。 以下は私が試しているコードです。私はこの新しいことを助けてください: 私はこの動的な作り方に固執しています。

public static int[] Find(int totalItems, int[] values, int totalToBeSelected) 
{ 
    var i = values; 
    int[] results = new int[totalToBeSelected]; 

    var resultList = new List<int>(); 

    if (totalToBeSelected == 1) 
    { 
     resultList.Add(values.Max()); 
     return resultList.ToArray(); 
    } 
    Array.Sort(i); 
    var minmumDiff = (i[0] - i[1]) * -1; 

    for (int k = 1; k < i.Length; k++) 
    { 
     var differnce = i[k] - i[k - 1]; 

     if (differnce < minmumDiff) 
     { 
      resultList.Add(i[k]); 
      resultList.Add(i[k - 1]); 
      minmumDiff = differnce; 
     } 
    } 
    return resultList.ToArray(); 
} 
+0

がTechgigからの質問のように見える、それはないですか? –

+2

問題の実際の問題文を投稿できますか?入力からその出力をどのように得るのかははっきりしていません。また、あなたはあなたのコードにどのような入力を与えていますか、どのような出力を与え、どの出力をしたいですか?あなたは[mcve]を投稿できますか?デバッガでコードを踏んだり、プリントステートメントを追加して、期待していたものと異なるところを確認しましたか? – Dukeling

+0

@Dukeling質問を更新しました。詳細情報が必要な場合はお知らせください ありがとう –

答えて

1

この機能を見ることができます。

public static int[] Find(int totalItems, int[] values, int totalToBeSelected) 
    { 
     Array.Sort(values); 
     Array.Reverse(values); // We need any value greater than max items diff. Max array item (first item after the sort) enough for it. 
     int diff = values[0]; 
     int indx = 0; 
     for (int i = 0; i < totalItems - totalToBeSelected +1; i++) 
     { 
      int temp_diff = values[i] - values[i + totalToBeSelected - 1]; // We are looking for any items group that max and min value difference is minimum 
      if (temp_diff < diff) 
      { 
       diff = temp_diff; 
       indx = i; 
      } 
     } 

     int[] results = new int[totalToBeSelected]; 
     Array.Copy(values, indx, results, 0, totalToBeSelected); 

     return results; 
    } 

サンプル:

 Find(6, new int[] { 44, 55, 605, 100, 154, 190 }, 1); 
     Out: { 605 } 

     Find(5, new int[] { 15, 85, 32, 31, 2 }, 2); 
     Out: { 32, 31 } 
1

問題の条件は不明ですが、いくつかの前提があります。

class Program 
{ 
     static void Main(string[] args) 
     { 
      var items = new[] {12,14,22,24,6};//new[] { 15, 85, 32, 31, 2};//new[] { 44, 55, 605, 100, 154, 190 }; 
      var totalItems = items.Count(); 
      var numberOfItemsToSelect = 3; 

      var result = Find(totalItems, items, numberOfItemsToSelect);    

      PrintList(result); 

      Console.ReadLine(); 
     } 

     static void PrintList(IEnumerable<int> scoreList) 
     { 
      foreach (var score in scoreList) 
      { 
       Console.Write(score); 
       Console.Write(" "); 
      } 
     } 

     public static int[] Find(int totalItems, int[]values, int totalTobeSelected) 
     { 
      var result = new List<int>(); 
      if (totalTobeSelected <= 1) 
      { 
       result.Add(values.Max()); 

      } 
      else if (totalTobeSelected == totalItems) 
      { 
       result.AddRange(values.OrderBy(i => i).ToList()); 
      } 
      else 
      { 

       var mainSet = values.OrderBy(i => i).ToList(); 
       var setDic = new Dictionary<int, IEnumerable<int>>(); 

       for (int i = 0; (totalItems - i >= totalTobeSelected); i++) 
       { 
        var set = mainSet.GetRange(i, totalTobeSelected); 

        //Inside a set, we choose the difference between the first and the second number 
        // ex: set = {2, 4, 9} => diff = |2-4| = 2. 
        var diff = Math.Abs(set[0] - set[1]); 

        // given two sets with the same diff, we select the first one base on the sort order of the main set: 
        // ex: main set = {2,4,8,10}. Both {2,4} and {6,8} have a diff of 2 so we select {2,4} 
        if (setDic.ContainsKey(diff)) continue; 
        setDic.Add(diff, set); 

       } 

       if (setDic.Count > 0) 
       { 
        var minKey = setDic.Keys.Min(); 
        result.AddRange(setDic[minKey]); 
       } 

      } 
      return result.ToArray(); 
     } 
    } 
関連する問題