当前位置: 首页 > Web前端 > JavaScript

刷leetcode17,栈与javascript分类(图文视频讲解)_1

时间:2023-03-27 11:50:10 JavaScript

目录栈特点:先进后出(FILO)使用场景:十进制转二进制函数调用栈js中没有栈,但是可以用数组模拟42/242%2=021/221%2=110/210%2=05/25%2=12/22%2=01/21%2=1堆栈:[0,1,0,1,0,1]res:101010fn1(){fn2()}fn2(){fn3()}fn3(){}fn1()stack:[fn1,fn2,fn3]stack的时间复杂度:压入和弹出O(1),搜索O(n)155。最小栈(easy)设计一个栈,支持push、pop、top操作,可以在常数时间内取出最小的元素。实现MinStack类:MinStack()初始化堆栈对象。voidpush(intval)将元素val压入堆栈。voidpop()移除栈顶元素。inttop()获取栈顶元素。intgetMin()获取堆栈中的最小元素。示例1:输入:["MinStack","push","push","push","getMin","pop","top","getMin"][[],[-2],[0],[-3],[],[],[],[]]输出:[null,null,null,null,-3,null,0,-2]解释:MinStackminStack=newMinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.getMin();-->返回-3.minStack.pop();minStack.top();-->返回0.minStack.getMin();-->返回-2。提示:-231<=val<=231-1pop、top和getMin操作总是在非空栈上调用push、pop、top和getMin调用3*104次思路:定义两个栈stack和min_stack,栈为正常压入,而min_stack只会压入需要压入栈顶的较小的元素。getMin返回min_stack的栈顶元素,top返回栈顶元素。复杂度:所有操作的时间复杂度为O(1)js:varMinStack=function(){this.stack=[];this.min_stack=[Infinity];};//正常压栈,min_stack只会压栈MinStack.prototype.push=function(x){this.stack.push(x);this.min_stack.push(Math.min(this.min_stack[this.min_stack.length-1],x));};//栈正常出栈,min_stack正常出栈MinStack.prototype.pop=function(){this.堆栈弹出();this.min_stack.pop();};//返回栈顶元素MinStack.prototype.top=function(){returnthis.stack[this.stack.length-1];};//返回min_stack栈顶元素MinStack.prototype.getMin=function(){returnthis.min_stack[this.min_stack.length-1];};682.棒球比赛(简单)你现在是一场特殊棒球比赛的得分手。比赛由几轮组成,前几轮的分数可能会影响后面几轮的分数。游戏开始时,记录为空白。你会得到一个字符串列表ops来记录操作,其中ops[i]是你需要记录的第i个操作,ops遵循以下规则:整数x-表示新的分数x"+"-表示本轮的新得到的分数是前两次分数的总和。题目数据保证在记录该操作时始终有两个有效的前面分数。“D”——表示本轮获得的新分数是之前分数的两倍。问题数据保证在记录此操作时始终存在有效的前面分数。“C”-表示之前的分数无效并从记录中删除。问题数据保证在记录此操作时始终存在有效的前面分数。请返回记录中所有分数的总和。示例1:输入:ops=["5","2","C","D","+"]输出:30解释:“5”-将5添加到记录中,记录现在是[5]"2"-将2添加到记录中,记录现在是[5,2]"C"-使之前的分数无效并删除记录,现在记录是[5]。“D”——将2*5=10加到记录中,记录现在是[5,10]。"+"-记录加5+10=15,记录现在是[5,10,15]。所有分数的总和5+10+15=30示例2:输入:ops=["5","-2","4","C","D","9","+","+"]输出:27解释:"5"-将5添加到记录中,记录现在是[5]"-2"-将-2添加到记录中,记录现在是[5,-2]"4"-将4添加到记录中,记录现在是[5,-2,4]"C"-使之前分数的记录无效并删除它,记录现在是[5,-2]"D"-记录加2*-2=-4,记录现在是[5,-2,-4]"9"-记录加9,记录现在是[5,-2,-4,9]"+"-记录加-4+9=5,记录现在是[5,-2,-4,9,5]“+”-记录加上9+5=14,记录现在是[5,-2,-4,9,5,14]所有分数的总和5+-2+-4+9+5+14=27示例3:输入:ops=[“1”]输出:1提示:1<=ops.length<=1000ops[i]is"C”、“D”、“+”或表示整数的字符串。整数范围为[-3104,3104]对于“+”操作,题目数据保证在记录本次操作时,操作前始终有两个有效分数对于“C”和“D”操作,题目数据保证在记录这个操作的时候前面总是有一个有效的分数复杂度:时间复杂度O(n),空间复杂度O(n)js:letcalPoints=function(ops){letres=[];for(leti=0;ii+j,0);};946。验证堆栈序列(中)给定两个序列pushed和popped,每个序列中的值不重复,只有当它们可能是在初始为空的堆栈上进行一系列push和pop操作的结果时才返回true;否则,返回假。示例1:输入:pushed=[1,2,3,4,5],popped=[4,5,3,2,1]输出:true解释:我们可以按以下顺序执行:push(1),推(2)、推(3)、推(4)、弹出()->4、推(5)、弹出()->5、弹出()->3、弹出()->2、弹出()->1示例2:输入:pushed=[1,2,3,4,5],popped=[4,3,5,1,2]输出:false解释:1不能在2之前弹出。Tips:1<=pushed.length<=10000<=pushed[i]<=1000pushed的所有元素都是互不相同的。popped.length==pushed.lengthpopped是push过大的排列动画。点击查看思路:使用栈模拟在出栈和入栈的过程中,当popped中index指向的位置的元素与栈顶元素一致时,出栈和index++,最后判断栈是否为空。复杂度:时间复杂度O(n),在pushed元素被push和pop一次,空间复杂度为O(n),栈的大小为js:constvalidateStackSequences=(pushed,popped)=>{conststack=[];//利用栈来模拟出栈和入栈的过程letindex=0;constlen=pushed.length;for(leti=0;i