【问题标题】:Hackerearth Feel TallerHackerearth 感觉更高
【发布时间】:2020-09-20 16:23:44
【问题描述】:

问题链接 -> https://www.hackerearth.com/practice/data-structures/stacks/basics-of-stacks/practice-problems/algorithm/feel-taller/

我的代码或逻辑有什么问题?

我使用 STACK 从上一栋建筑物开始跟踪比当前建筑物高的建筑物的数量。我通过跟踪堆栈中的元素数量(比当前元素高的元素)来做到这一点。

在查询中,我从右边减去左边并加 1。 left -> 从左边可以看到的建筑物数量 right -> 从右侧可以看到的建筑物数量 如果我们减去两者,我们得到的建筑物数量比范围内可见的要多。

考虑一个例子:有 7 个柱子 (k),每个柱子的高度为 5 2 3 7 9 8 11。使用堆栈我跟踪大于当前柱子的柱子数量(因此在其上可见)并存储它在数组 p 中。其值为 (当前柱子的高度)->(大于此柱子的柱子数) 5->3 2->4 3->3 7->2 9->1 8->1 11->0 。在查询中,我从左边减去右边,因为左边的柱子数量大于当前柱子,如果我减去右边,我得到范围内的柱子。

我想知道这个逻辑有什么问题。

这个问题有不同的方法,我知道。 请告诉我这段代码有什么问题。

链接到我的代码 -> https://www.hackerearth.com/submission/42773897/

//https://www.hackerearth.com/practice/data-structures/stacks/basics-of-stacks/practice-problems/algorithm/feel-taller/
//Feel Taller
import java.util.*;
import java.io.*;
public class Feel_Taller{
    public static void main(String[] args) throws Exception{

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();

        int k = Integer.parseInt(br.readLine().trim());
        StringTokenizer st = new StringTokenizer(br.readLine().trim());

        long a[] = new long[k];
        for(int i=0;i<k;i++)
            a[i] = Long.parseLong(st.nextToken());

        Stack<Integer> s = new Stack<Integer>();
        int n = 0;                              //Number of elements in the stack
        int p[] = new int[k];                   //Number of pillars greater than this pillar

        for(int i = k-1;i>=0;i--)
        {
            while(!s.empty() && a[s.peek()]<=a[i]){
                s.pop();
                n--;
            }
            p[i] = n;
            s.push(i);
            n++;
        }

        //Queries
        int q = Integer.parseInt(br.readLine().trim());
        while(q-->0){
            st = new StringTokenizer(br.readLine().trim());
            int l = Integer.parseInt(st.nextToken());
            int r = Integer.parseInt(st.nextToken());
            if(r>=k)
                r = k-1;
            sb.append(p[l]-p[r]+1).append("\n");
        }

        pw.print(sb);
        pw.flush();
        pw.close();
    }
}

或者请解释我们如何使用我的方法解决问题。 谢谢。

【问题讨论】:

  • 考虑一个例子:有 7 根柱子 (k),每根柱子的高度为 5 2 3 7 9 8 11 。使用堆栈我跟踪大于当前支柱的支柱数量并将其存储在数组 p 中。其值为 (当前柱子的高度)->(大于此柱子的柱子数) 5->3 2->4 3->3 7->2 9->1 8->1 11->0 。在查询中,我从左边减去右边,因为左边的柱子数量大于当前柱子,如果我减去右边,我得到的柱子在范围内。
  • 如果您想了解更多 Stack Overflow 问题(我希望如此):欢迎提供更多信息和解释。请在问题本身中添加它,而不是作为评论。把所有东西都放在一个地方很好,很多用户不会阅读 cmets。
  • 感谢您的建议。

标签: java data-structures stack


【解决方案1】:

如果没有研究过你的代码,这就是你的逻辑似乎出错的地方:你的减法并不总是会给出正确的结果。

考虑这一排建筑物或柱子:

7 3 5

现在我认为你的高柱数应该是 7->0 3->1 和 5->0。

当我查询范围 [0, 1] 时,答案应该是 1:只有 7 座高楼可见。你的减法p[l]-p[r]+1 产生 0 - 1 + 1 = 0,所以一栋楼太少了。一种说法是,您为 5 座高楼减去 1,因为它超出了查询范围,但该建筑物一开始是不可见的,因此不应减去。

【讨论】:

  • 非常感谢?我搞砸了逻辑?
猜你喜欢
  • 2010-09-23
  • 2019-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 2019-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多