C# 如何获取包含最小差异数组元素的数组

C# 如何获取包含最小差异数组元素的数组,c#,arrays,algorithm,equation-solving,C#,Arrays,Algorithm,Equation Solving,我们必须根据要选择的项目输入3选择最佳项目。我们的选择应该是这样的,我们不总是采取最大的项目。我们取而代之的是差异不大的项目 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 shou

我们必须根据要选择的项目输入3选择最佳项目。我们的选择应该是这样的,我们不总是采取最大的项目。我们取而代之的是差异不大的项目

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();
}
public static int[]Find(int totalItems,int[]值,int totalToBeSelected)
{
var i=价值;
int[]结果=新的int[totalToBeSelected];
var resultList=新列表();
如果(totalToBeSelected==1)
{
Add(values.Max());
返回resultList.ToArray();
}
数组.排序(i);
var minmumDiff=(i[0]-i[1])*-1;
对于(int k=1;k
问题中的条件不清楚,必须做出一些假设

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();
        }
    }
类程序
{
静态void Main(字符串[]参数)
{
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结果=查找(totalItems、items、numberOfItemsToSelect);
打印列表(结果);
Console.ReadLine();
}
静态无效打印列表(IEnumerable scoreList)
{
foreach(分数表中的var分数)
{
控制台。写入(分数);
控制台。写(“”);
}
}
公共静态int[]查找(int totalItems、int[]值、int totalTobeSelected)
{
var result=新列表();
如果(totalTobeSelected i.ToList());
}
其他的
{
var mainSet=values.OrderBy(i=>i.ToList();
var setDic=新字典();
对于(int i=0;(totalItems-i>=totalTobeSelected);i++)
{
var set=mainSet.GetRange(i,totalTobeSelected);
//在集合中,我们选择第一个数字和第二个数字之间的差值
//例如:set={2,4,9}=>diff=| 2-4 |=2。
var diff=Math.Abs(集合[0]-set[1]);
//给定两个具有相同差异的集合,我们根据主集合的排序顺序选择第一个集合:
//主集合={2,4,8,10},{2,4}和{6,8}的差值都是2,所以我们选择{2,4}
如果(设置容器(差异))继续;
设置。添加(差异,设置);
}
如果(setDic.Count>0)
{
var minKey=setDic.Keys.Min();
result.AddRange(setDic[minKey]);
}
}
返回result.ToArray();
}
}

问题中的条件不清楚,必须做出一些假设

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();
        }
    }
类程序
{
静态void Main(字符串[]参数)
{
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结果=查找(totalItems、items、numberOfItemsToSelect);
打印列表(结果);
Console.ReadLine();
}
静态无效打印列表(IEnumerable scoreList)
{
foreach(分数表中的var分数)
{
控制台。写入(分数);
控制台。写(“”);
}
}
公共静态int[]查找(int totalItems、int[]值、int totalTobeSelected)
{
var result=新列表();
如果(totalTobeSelected i.ToList());
}
其他的
{
var mainSet=values.OrderBy(i=>i.ToList();
var setDic=新字典();
对于(int i=0;(totalItems-i>=totalTobeSelected);i++)
{
var set=mainSet.GetRange(i,totalTobeSelected);
//在集合中,我们选择第一个数字和第二个数字之间的差值
//例如:set={2,4,9}=>diff=| 2-4 |=2。
var diff=Math.Abs(集合[0]-set[1]);
//给定两个具有相同差异的集合,我们根据主集合的排序顺序选择第一个集合:
//主集合={2,4,8,10},{2,4}和{6,8}的差值都是2,所以我们选择{2,4}
如果(设置容器(差异))继续;
设置。添加(差异,设置);
}
如果(setDic.Count>0)
{
var minKey=setDic.Keys.Min();
result.AddRange(setDic[minKey]);
}
}
返回result.ToArray();
}
}

您可以查看此函数

    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;
    }

你可以看看这个函数

    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;
    }

看起来像是Techgig的问题,不是吗?你能发布问题的实际问题陈述吗?不清楚你是如何从输入中得到输出的。另外,您给代码提供了什么输入,它提供了什么输出,您想要什么输出?你能发一封信吗?您是否已在调试器或添加打印语句中检查了您的代码,以查看它与您预期的不同之处?@Dukeling我已更新了问题,如果您需要更多信息,请告诉我,谢谢。请到StackOverflow来。请阅读并遵循帮助文档中的发布指南。适用于这里。我们不能