首页 > 编程知识 正文

对称二叉树 leetcode,单调栈算法

时间:2023-05-05 08:34:17 阅读:34513 作者:1860

数据结构-单调堆栈leet代码的下一个较大数字2是由leet代码主题引入的。

刷问题的时候看到这个问题,第一反应是使用循环序列暴力解决了问题,所以附上代码

暴力解题代码public static int [ ] nextgreaterelements (int [ ] nums ) { int[] res=new int[nums.length]; Arrays.fill(RES,-1); int j; 索引; for(intI=0; i nums.length; I () { j=i 1; while () index=) j%nums.length )!=i () if ) nums[index]nums[I] ) { res[i]=nums[index]; 布雷克; (j; } }返回RES; }提交后发现速度较慢,查看解决问题了解单调堆栈这一数据结构,然后了解单调堆栈

简单来说,单调堆栈就是堆栈中的元素单调有序

具体而言,可以根据单调增加和单调减少分为单调增加堆栈和单调减少堆栈(例如

理解以上概念后,动手实现单调堆栈

模拟单调堆栈过程:给定数据:使用7 6 4 9单调堆栈解析过程模拟7点堆栈为空。 对于7点堆栈,堆栈中的元素是7点堆栈上的元素是7, 67点堆栈中的元素为7 6点堆栈上的元素为6点堆栈上的元素为6点,46点堆栈中的元素为7 6点4点堆栈上的元素为9点堆栈上的元素为9点,对于不满足94堆栈条件的循环处理4出去堆栈,堆栈中的元素为7 6出去, 6外栈的情况下堆栈内要素为7外,7外栈的情况下堆栈内要素为空栈,满足堆栈条件的9个堆栈的情况下堆栈内要素为9单调堆栈代码package stack; /** *通过单调堆栈实现单调增加(每次提取元素时先提取最小元素,全部提取元素时以增加方式提取(* */publicclassmonstack { privatenodehead; 私有长度; 公共堆栈() head=newnode ) ) 0,null ); 长度=0; }公共语音推送(英特尔) { while (! isempty(peek ) element ) { pop ); (}长度; 节点节点=new node (element,head.next ); head.next=node; }公共int pop () if (isempty ) )返回- 1; 长度- -; 节点节点=head.next; head.next=node.next; return node.element; } public int peek () { return head.next.element; }公共布尔isempty () { return length==0; }隐私保护节点{隐私插入元素; 私有节点下一步; 公共节点(intelement,Node next ) { this.element=element; this.next=next; } publicstaticvoidmain (string [ ] args ) { MonStack monStack=new MonStack ); monstack.push(7; monstack.push(6; monstack.push(4; monstack.push(3; monstack.push(12; 系统. out.println (mon stack.pop ); 系统. out.println (mon stack.pop ); 系统. out.println (mon stack.pop ); }应用单调堆栈解决此问题

/**优化*从题意的性质可以看出,如果一个数找到了他的下一个更大的要素,那么该更大的要素前面和后面的数(两者之间的数)的下一个更大的要素是该更大的要素(例如,7 )6)4) 7的后面的数是9 遍历6此时堆栈顶部元素为7 67。 遍历4此时堆栈顶部元素为6 46。 遍历9此时堆栈顶部元素为9 94,不满足输入条件。 循环处理堆栈4,4的下一个大要素为9。 堆6,6的下一个大要素为9。 *堆栈7,将7的下一个大要素设定为9 *此时,即使堆栈在空的情况下继续遍历堆栈9的for循环并结束,只要没有找到大于9的要素就可以结束* @ param nums * @ return */publl Arrays.fill(RES,-1); dequeintegerstack=new linked list (; //循环nums.length*2 - 1的理由:本题是循环搜索,但最大循环不超过2次,直接循环2次即可//需要多次循环时采用直接类型即可for(intI=0; i nums.length*2 - 1; I () /单调堆栈的规则是,堆栈不为空的顶元素大于堆栈元素。 如果不满足//条件,请删除堆栈顶部元素以满足上述条件。 //简言之,堆栈的所有元素都小于第一个顶级元素。 但是,这里比较的是,元素值的大小被堆栈是该元素的下标while (! stack.isempty(nums[stack.peek ) nums [ I % nums.length ] (RES [ stack.pop ] )=nums [ I % nums.length ] } sttttststststststststststs }返回RES; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。