150. 逆波兰表达式求值 - 力扣(LeetCode)
看题解前:折磨致死,各种问题,什么转整形啊,int不够啊。思路,用map和包装器封装四则运算,利用一个栈,遇到数字的时候把数字入栈,遇到操作符弹出两个数字进行运算,然后将结果入栈到栈中,最后返回栈顶元素即可。
需要注意的点:
1、给的是一个字符,转化成整形需要-'0’或者调用stoi
2、给定的测试用例数据很大,int放不下,改用long long才给通过(有点恶心)
看题解后:整体思路差不多,也是用栈 实现,然后用if判断是哪个操作符进行操作
239. 滑动窗口最大值 - 力扣(LeetCode)
看题解前:看起来还是比较简单,用result数组拷贝nums的数据,然后再利用一个tmp数组保留窗口内的数据,对tmp排序(默认升序),将tmp最后一个元素放到result中下标为begin的位置,最后的结果肯定是nums的数据个数减去k再加1,直接对result数组resize返回即可。
举个例子:nums = [1,3,-1,-3,5,3,6,7], k = 3
1、begin=0,end=3
result = 1,3,-1,-3,5,3,6,7
tmp = 1,3,-1 排序后-1,1,3
3插入到result中begin位置
result = 3,3,-1,-3,5,3,6,7
begin,end++
2、begin=1,end=4
result = 3,3,-1,-3,5,3,6,7
tmp = 3,3,-1 排序后-1,3,3
3插入到result中begin位置
result = 3,3,-1,-3,5,3,6,7
begin,end++
3、begin=2,end=5
result = 3,3,-1,-3,5,3,6,7
tmp = -1,-3,5排序后-1,-3,5
5插入到result中begin位置
result = 3,3,5,-3,5,3,6,7
begin,end++
依次类推即可,最后对result数组记得resize。
然后代码没过,超时了,应该是效率问题,也没有想到更高效的解法了只能看题解。
看题解后:使用deque构造了一个单调队列(从大到小),保证队列中都是由大到小的,窗口移动的时候如果push的数值大于入口元素的数值,那么就将队列后端的数值弹出,直到push的数值小于等于队列入口元素的数值为止。就可以保证该队列的front为当前最大元素,怎么做到的,简单讲解下我理解到的
1,3,-1,-3,5,3,6,7,k=3
1、先将第一个窗口的3个元素依次插入到队列q1;1直接插入,3插入时大于入口数值,先pop到入口树脂大于等于3或者为空位置,此时pop出1然后push进3,-1小于3直接push进去。q1=3,-1
2、窗口移动,如果左侧窗口移出的数值等于q1入口的数值,则q1需要pop,否则不需要pop操作,然后按上述规则将右侧窗口移进的数值push到q1。-3小于q1入口直接插入
q1=3,-1,-3
3、循环操作;5大于入口数值,q1进行pop操作,直到入口数值大于等于5为止,然后插入5,q1=5;3小于5直接插入,q1=5,3;6大于5,先pop再插入,q1=6;7大于6先pop再插入,q1=7;
把q1都单独拿出来
q1=3,-1
q1=3
q1=5
q1=5
q1=6
q1=7
可以看到q1每次入口数值即为该对应窗口的最大值,保存即可求解。
347. 前 K 个高频元素 - 力扣(LeetCode)
看题解前:蛮简单的,用map统计次数,然后vector拷贝map数据,再用一个仿函数进行排序,取将前k个高频的vecotr数据再插入到resul即可。
看题解后:同样使用map统计次数,然后用了一个小顶堆来排序,也就是优先级队列,保证自己为一个大小为k的堆同时会自动进行排序,就是记得自己写个仿函数,主要是优先级队列自己使用的比较少所以没想到。