欢迎光临散文网 会员登陆 & 注册

刷题第六天

2023-08-08 22:27 作者:叶荜莉  | 我要投稿

150. 逆波兰表达式求值:

这题我用的是栈,一个一个扫描字符,如果是数字的话,就进栈,如果是操作符的话,就依次pop出两个栈元素,再根据操作符进行相应操作后再将新元素push进栈。最后的结果就是栈顶。

一开始我用的栈是string类型,但是后面发现每次取出都要string转int,于是我直接定义栈为int类型。

在进行string转int时,我用的是atoi函数,atoi(s.c_str())。string类型不能直接使用atoi函数,要转化为char*类型。

239. 滑动窗口最大值:

这题我第一反应是用队列存储窗口,但是又不好判断窗口中的最大值,后面有想到优先队列,但是不知道怎么确定优先队列中的top是否还在窗口中(也是对优先队列不熟悉)。最后没有思路,看了题解,用了priority_queue<pair<int,int>> q,优先队列默认是大顶堆,first存值,second存值的下标。q先初始化,将k个值存入,将top存入结果集,接下来从下标k开始遍历,将新的值存入q,如果q中top下标超出范围,pop出。最后将满足条件的top存进结果集。

347. 前 K 个高频元素:

看完题目脑子里冒出来的就是优先队列(我也不知道为啥),priority_queue<pair<int,int>> q,first存次数,second存值。因为默认大顶堆,所以存进去的时候要将次数设为负数,这样就是负的小顶堆啦!

但是,开始写代码之后出现了问题,top是次数最小没错,但如果堆里有相同second值的pair怎么办。此时陷入僵局,但我还是觉得优先队列的思路是对的,突然脑瓜子灵光一闪,我想到可以先将数组排序,这样问题就解决了。

19. 删除链表的倒数第 N 个结点:

第三次做这个题了,掌握了思路,模拟一下过程,很快就AC了。

142. 环形链表 II:

第二次做这道题了。和第一次做法不一样,第一次使用的是计数节点出现次数。这次采用快慢指针,slow每次走一步,fast每次走两步,如果fast==slow时跳出循环,如果fast或者fast->next为null,则说明无环。此时f=2s=s+nb(环长度),s=nb,s如果要走到环头,是a+nb,因此此时s再走a步即可。

15. 三数之和:

这题的思路自己想了差不多,但具体实现还是想不出来,于是看了题解思路。这题的难点在于如何去重。

先将数组排序。遍历数组,使用一个map存储数组元素,如果出现过则跳过。令l=i+1,r=n-1,开始循环,循环条件为l<r,如果三数之和为0,就将i,l,r对应的元素存进结果集,再令i++,r--;如果三数之和大于0,说明正数过大,应使r--,反之l++。

这里有一个问题,如果数组为[-2,0,0,2,2],那么将产生重复结果。这里我将r--改为while(nums[r]==nums[--r]),但是又产生一个问题,如果数组为[0,0,0,0],r将一直减小直到溢出。因此我又改为while(l<r&&nums[r]==nums[--r])。

18. 四数之和:

给15.三数之和再套一层循环即可。需要注意(long)nums[a] + nums[b] + nums[c] + nums[d] == target,需要强制转化为long才行。









刷题第六天的评论 (共 条)

分享到微博请遵守国家法律