【发布时间】:2020-09-20 16:23:44
【问题描述】:
我的代码或逻辑有什么问题?
我使用 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