Algorithm 为什么我的算法没有';我在Codibility为曼哈顿天际线工作

Algorithm 为什么我的算法没有';我在Codibility为曼哈顿天际线工作,algorithm,manhattan,Algorithm,Manhattan,我在做Codibility的训练任务。我已经以100/100的比率完成了石墙,但我仍然坚持在该任务中解决曼哈顿天际线问题的主要思想。这里描述了该任务 当我第一次读到这个问题时,我意识到我应该只计算建造这堵墙的最小石块数量。关于如何扩展块等等,没有任何解释(可能假设包括我必须事先知道,但我从未处理过这样的问题)。根据我对这个问题的理解,我实现了下一个算法(因为结果是错误的) 我认为这是一个线索。(我应该把较小的积木叠在较大的积木上。)但后来我看了一眼可能有积木排列的数字,又把我弄糊涂了 二, 最后

我在做Codibility的训练任务。我已经以100/100的比率完成了石墙,但我仍然坚持在该任务中解决曼哈顿天际线问题的主要思想。这里描述了该任务

当我第一次读到这个问题时,我意识到我应该只计算建造这堵墙的最小石块数量。关于如何扩展块等等,没有任何解释(可能假设包括我必须事先知道,但我从未处理过这样的问题)。根据我对这个问题的理解,我实现了下一个算法(因为结果是错误的)

我认为这是一个线索。(我应该把较小的积木叠在较大的积木上。)但后来我看了一眼可能有积木排列的数字,又把我弄糊涂了

  • 二, 最后,我使用上面的第二张图片实现了它,效果很好(100%的可编码性)

    public int solution2(最终int[]H)
    {
    如果(H.length==1)
    {
    返回1;
    }
    整数块=0;
    最终ArrayQue堆栈=新ArrayQue();
    stack.push(H[0]);
    对于(int i=1;i0&&stack.peek()>H[i])
    {
    stack.pop();
    blocks++;
    }
    if(stack.isEmpty()| stack.peek()

    有人能给我解释一下为什么第一个算法不适合这个任务吗?

    我根本不理解这个任务。。这是非常模糊的描述。这就好像你需要提前知道一些事情。
    public int solution(final int[] H)
        {
            if (H.length == 1)
            {
                return 1;
            }
    
            int blocks = 0;
            int first = 0;
            for (int i = 1; i <= H.length; i++)
            {
                if (i == H.length || H[first] > H[i])
                {
                    for (int k = first; k < i; k++)
                    {
                        if (H[k] != 0)
                        {
                            for (int t = k + 1; t < i && H[k] <= H[t]; t++)
                            {
                                if (H[t] >= H[k])
                                {
                                    H[t] = H[t] - H[k];
                                }
                                else
                                {
                                    break;
                                }
                            }
                            blocks++;
                        }
                    }
                    first = i;
                }
            }
            return blocks;
        }
    
    The intuition is that by extending each stone block to the ground, we obtain a set of
    buildings forming the given skyline.
    
    public int solution2(final int[] H)
        {
            if (H.length == 1)
            {
                return 1;
            }
    
            int blocks = 0;
            final ArrayDeque<Integer> stack = new ArrayDeque<Integer>();
            stack.push(H[0]);
    
            for (int i = 1; i < H.length; i++)
            {
    
                while (stack.size() > 0 && stack.peek() > H[i])
                {
                    stack.pop();
                    blocks++;
                }
                if (stack.isEmpty() || stack.peek() < H[i])
                {
                    stack.push(H[i]);
                }
            }
    
            return blocks + stack.size();
        }