美文网首页
可见的山峰对数量

可见的山峰对数量

作者: Tank_Mao | 来源:发表于2021-01-27 18:06 被阅读0次
package pers.mao.stackAndQueue.demo_11;

import java.util.Stack;

/**
 * @author Mao Qingbo
 * @date 2021-01-27
 */
public class GetVisibleMountainNum {
    public int getVisibleNum(int [] arr){
        if(arr == null || arr.length < 2){
            return 0;
        }
        int size = arr.length;
        int maxIndex = 0;
        //先在环中找到其中一个最大值的位置,哪一个都行
        for(int i = 0; i < size; i++){
            maxIndex = arr[maxIndex] < arr[i] ? i : maxIndex;
        }
        Stack<Record> stack = new Stack<Record>();
        //先将(最大值,1)这个记录放在stack中
        stack.push(new Record(arr[maxIndex]));
        //从最大值位置的下一个位置开始沿next方向遍历
        int index = nextIndex(maxIndex,size);
        //用“小找大”的方式统计所有可见山峰对
        int res = 0;
        //遍历开始,当index再次回到maxIndex的时候,说明转了一圈,遍历结束
        while(index != maxIndex){
            //当前数字arr[index]要进站,判断是否能满足栈顶到栈底依次递增
            //若能,则压入栈;若不能,则弹出栈顶记录,并计算山峰对数量
            while(stack.peek().value < arr[index]){
                int k = stack.pop().times;
                //弹出记录为(x,k),如果k == 1,产生两对;如果k > 1,产生 2*k+C(2,k)对
                res += getInternalSum(k) + 2 * k;
            }
            //当前数字arr[index]要进栈,若和栈顶数字一样,就合并;否则将记录(arr[index],1)压入栈
            if(stack.peek().value == arr[index]){
                stack.peek().times++;
            }
            else{
                stack.push(new Record(arr[index]));
            }
            index = nextIndex(index,size);
        }
        //清算阶段开始
        //清算阶段的第1小阶段
        while (stack.size() > 2){
            int times = stack.pop().times;
            res += getInternalSum(times) + 2 * times;
        }
        //清算阶段的第2小阶段
        if(stack.size() == 2){
            int times = stack.pop().times;
            res += getInternalSum(times) + times;
        }
        //清算阶段的第3小阶段
        res += getInternalSum(stack.pop().times);
        return res;
    }

    //环形数组当前位置为i,数组长度为size,返回i的下一个位置
    public int nextIndex(int i,int size){
        return i < size -1 ? i+1 : 0;
    }

    //如果k == 1,返回0;否则,返回C(2,k)
    public int getInternalSum(int k){
        return k == 1 ? 0 : (k * (k - 1) / 2);
    }
}

相关文章

  • 可见的山峰对数量

  • 何其

    观山峰其远 在世浊水深 身陷泥沼地 仰可见繁星

  • 远山如黛,好天可鉴

    今天站在阳台上,放眼望去,湖边的几座山峰清晰可见,心情不由大好。 一场春雪过后,天空被彻底净化了。 那几座山峰,并...

  • 对你可见

    原来某一天 我也会发个朋友圈 只是对你可见

  • 第二十章  河边交谈

    就在这时候,前方的一座山峰出现变化。那本是一座平平无奇的山峰,但正在以肉眼可见的速度改变,山路、台阶、凉亭、花园等...

  • 厚重

    远处山峰在薄雾中隐约可见,与近处这堆巨石相辉映,尤显山石之厚重。

  • 思考1

    自己还是那么的容易动怒 旅行去过一个寺庙,在寺庙的里面看到有一个小山峰,山峰的墙体醒目的可见一些山洞,洞口还有经幡...

  • 对可见未来的预测

    尽管我们的生活充满了许多不可控素 ,但是对于未来的预测还是能够给这种不确定性增加确定性的可能,增加我们做出正确选择...

  • 商业分析 | 宝洁销售额预测分析

    一、数据描述 1.数据行/列数量 2.缺失值分布2.1local_tv有缺失值 可见local_tv投入对销售收入...

  • 山峰

    我曾经想爬过一座山, 这座山时隐时现,经常被雾气淹没。 我自卑的以为我没有办法爬上这座山, 它屹立于群山之中, 看...

网友评论

      本文标题:可见的山峰对数量

      本文链接:https://www.haomeiwen.com/subject/ccwazktx.html