我的算法中的缺陷在哪里找到每个元素在dista内的最大子数组的大小

时间:2016-08-16 05:35:34

标签: c# algorithm sorting time-complexity

例如,给定数组A={1,3,2,17,10},答案是3,因为集合{1,2,3}是最大的集合,对于集合中的某些a,每个元素都是集合中的范围是[a, a + 4](包括a+4)。

我的算法就像

    int[] toys = Array.ConvertAll(Console.ReadLine().Split(' '), Int32.Parse);
    Array.Sort(toys);
    int max_together = 0;
    for(int i = 0; i < toys.Length; ++i)
    {
        int plus_four = toys[i] + 4;
        int j = i + 1;
        for(; j < toys.Length && toys[j] <= plus_four; ++j);
        int span = j - i;
        if(span > max_together)
        {
             max_together = span;               
        }
    }

并且大多数测试用例都失败了。

或者我正在错误地阅读https://www.hackerrank.com/challenges/priyanka-and-toys?h_r=next-challenge&h_v=zen ......

我的完整解决方案是

using System;
using System.Collections.Generic;
using System.IO;
class Solution
{
    static void Main(String[] args)
    {
        Console.ReadLine(); // N
        int[] toys = Array.ConvertAll(Console.ReadLine().Split(' '), Int32.Parse);
        Array.Sort(toys);
        int max_together = 0;
        for(int i = 0; i < toys.Length; ++i)
        {
            int plus_four = toys[i] + 4;
            int j = i + 1;
            for(; j < toys.Length && toys[j] <= plus_four; ++j);
            int span = j - i;
            if(span > max_together)
            {
                 max_together = span;               
            }
        }
        Console.WriteLine(1 + (toys.Length - max_together));
    }
}

1 个答案:

答案 0 :(得分:0)

如果您购买1件重量为w1的玩具,您可以免费获得重量介于[w1,w1 + 4]之间的所有玩具。问题要求您找到您需要购买的最少数量的玩具,以便您在输入中获得所有玩具。在这个例子中A = {1,3,2,17,10},答案是3,因为你需要购买玩具1(或2或3),17和10。

Java代码

int num[] = {1,3,2,17,10};
 Arrays.sort(num);
        int result=1;
        int lastToy=num[0];
        for(int i=1;i<n;i++)
            {
            if(num[i] > lastToy+4)
                {
                result++;
                lastToy= num[i];
            }
        }