单调栈玩法---烽火台

具体问题是:
n 个 烽火台围成一个圈,任意两个烽火台只要中间的烽火台比他们两个都低就能看见彼此,当然相邻的肯定能看见对面,求能看见彼此的对数。

单调栈玩法---烽火台_第1张图片
我们第一步就是找出这一圈数值中的最大值。为什么?因为这样我们就能确保后面的数向左至少和最大值能配成一对烽火台,我们只要观察右边的即可。
单调栈玩法---烽火台_第2张图片

单调栈玩法---烽火台_第3张图片

单调栈玩法---烽火台_第4张图片

public static long communications(int [] arr)
	{
		if(arr==null||arr.length<2)
		{
			return 0;
		}
		int size=arr.length;
		int maxIndex=0;
		for(int i=0;istack=new Stack();
		//前面循环可知value是最大值,将最大值的次数和值大小压入栈中
		stack.push(new Pair(value));
		while(index!=maxIndex)
		{
			value=arr[index];
			while(!stack.isEmpty()&&stack.peek().value1)//不是倒数第一	
				{
					res+=times;//满足了1、的情况
				}else { //size==1,看最大数的times是1还是为k>1
					//如果times>1就是 res+=times满足3、的情况
					//吐过times不满足,那么就是res=res+0;满足了2、的情况
					res+=stack.peek().times>1?times:0;
				}
			}
		}
		return res;
		}
	
	public static int nextIndex(int size,int i)
	//因为是环,所以设置了size确定是否到达底部,未达到就i+1,达到了就置为0,说明到达了开头
	{
		return i<(size-1)?(i+1):0;
	}
	
	public static long getInternalSum(int n)
	{
		return n==1L?0L:(long)n*(long)(n-1)/2L;
	}
	
	public static class Pair{
		//建一个类,stack中存储的就是Pair类型,值+次数
		public int value;
		public int times;
		
		public Pair(int value)
		{
			this.value=value;
			this.times=1;
		}
	}
	
	
	public static void main(String[] args) {
		int []arr= {1,2,4,5,3};
		System.out.println(communications(arr));
	}

你可能感兴趣的:(JAVA,算法)