
刷题日记
记录愉快的刷题时光
Yungang_Young
这个作者很懒,什么都没留下…
-
原创 力扣92_反转链表II
题目描述: 给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回反转后的链表 。 示例: 算法思想: 在上一篇文章 反转链表I 中,我们学会了反转一个完整的链表,在做本题之前,先思考一个容易一点的问题,如何反转一个链表的前N个节点?如图所示: 有没有发现与上一篇文章的区别,就在1这个节点上,上一篇文章是把这个节点指向了null,而这里是把1这个节点指向了4,也就是说,如果我们像上一篇2021-04-09 14:24:4310
0
-
原创 力扣503_下一个更大元素II
题目描述 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。 示例: 输入: [1,2,1] 输出: [2,-1,2] 解释: 第一个 1 的下一个更大的数是 2; 数字 2 找不到下一个更大的数; 第二个 1 的下一个最大的数需要循环搜索,结果也是 2。 算法思想 和力扣496类似,同样运用到单调栈,这道题的难点在2021-03-29 21:48:374
0
-
原创 力扣496_下一个更大元素I
题目描述: 给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。 请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。 输入: nums1 = [4,1,2], nums2 = [1,3,4,2]. 输出: [-1,3,-1] 解释: 对于 num1 中的数字 4 ,你无法在第二个数组中找到下一个更大的数字,因此输出 -1 。 对于 num1 中的数字 1 ,第二个数组中数字1右边的下一个较大数字是 3 。 对于 num1 中的数字 2 ,2021-03-25 15:14:564
0
-
原创 力扣682_棒球比赛
题目描述: 你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。 比赛开始时,记录是空白的。你会得到一个记录操作的字符串列表 ops,其中 ops[i] 是你需要记录的第 i 项操作,ops 遵循下述规则: 整数 x - 表示本回合新获得分数 x “+” - 表示本回合新获得的得分是前两次得分的总和。题目数据保证记录此操作时前面总是存在两个有效的分数。 “D” - 表示本回合新获得的得分是前一次得分的两倍。题目数据保证记录此操作时前面总是存在一个有效2021-03-24 15:28:5512
0
-
原创 力扣844_比较含退格的字符串
题目描述: 给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 # 代表退格字符。 注意:如果对空文本输入退格字符,文本继续为空。 算法思想: 本文采用暴力解决法,分别使用两个栈,用进栈出栈来模拟退格操作,最后栈内的值就是要比较的最终值,注意空文本的处理,若遇到空文本出栈,则直接不做任何操作 代码如下: class Solution { public boolean backspaceCompare(String S, String T) {2021-03-22 23:38:006
0
-
原创 力扣232_用栈实现队列
题目描述: 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类: void push(int x) 将元素 x 推到队列的末尾 int pop() 从队列的开头移除并返回元素 int peek() 返回队列开头的元素 boolean empty() 如果队列为空,返回 true ;否则,返回 false 算法思想: 一个栈作为输入栈,用于push数据,一个栈作为输出栈,用于pop和peek数据,当有数据要入队时,全部pu2021-03-17 10:40:440
-
原创 力扣155_最小栈
题目描述: 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 push(x) —— 将元素 x 推入栈中。 pop() —— 删除栈顶的元素。 top() —— 获取栈顶元素。 getMin() —— 检索栈中的最小元素。 算法思想: 要想在常数时间内检索到最小元素,我们可以设置一个辅助栈,栈顶记录了当前栈中的最小值,辅助栈与主栈同进出,这样的话,就保证了对栈顶元素即最小值的更新 代码如下: class MinStack { Deque<Integer&2021-03-16 11:43:105
0
-
原创 力扣20_有效的括号
题目描述: 给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 算法思想: 很容易想到使用栈这种数据结构,遇到左括号就入栈,遇到右括号就与栈顶元素进行比对。 书写过程中会遇到以下问题: (1)如何知道匹配成功? (2)栈空了怎么办?如{[]}),到‘)’时就会出现栈空报错 解决方案: (1)使用一个哈希表来做匹配 (2)预先压入’?'防止栈空 代码如下: class Sol2021-03-15 17:02:285
0
-
原创 力扣876_链表的中间结点
题目描述: 给定一个头结点为 head 的非空单链表,返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点 注:这里的头结点就是第一个结点 解题思路: 本来打算用栈,先把所有结点压入栈中,并记录有多少个结点,然后依次出栈,出一半的结点就能找到中间结点,但是超出了时间限制 其实,用快慢指针能做到O(1)空间复杂度的前提下完美达到O(n)的时间复杂度 快指针fast一次走两个结点,慢指针slow一次走一个结点,待快指针走到结尾时,慢指针刚好走到中间结点 代码如下: class Solution {2021-03-12 12:09:454
0
-
原创 力扣19_删除链表的倒数第N个结点
题目描述: 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。(使用一趟扫描实现) 算法思想:使用双指针p,q,q指针比p指针快n个结点,当q指针指向末尾null时,p指针刚好指在待删除的结点n上,不过,要删除此结点,还需要借助它的前驱结点,故引入虚拟结点,令它指向头结点,p结点从虚拟结点开始,如下图所示(n=2) 初始状态时: 终止状态: 代码实现: class Solution { public ListNode removeNthFromEnd(ListNode head,2021-03-11 17:47:513
0
-
原创 力扣_21 合并两个有序链表
题目描述:将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 思路:创建一个中间点l,分别遍历两个链表,依次把值小的加入中间点后面,注意指针pre指向的是刚插入的结点,每次都得往下一个结点走 代码如下: class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode l = new ListNode(); ListNode2021-03-10 11:59:3716
0
-
原创 力扣141_环形链表
判断链表是否有环 运用快慢指针,类似于“龟兔”,假设表中有环,那么速度快的“兔子”则首先进入环,然后在里面绕圈,“乌龟”后入环,它们都在一个环内绕圈,由于速度不等,则一定会相遇。 public boolean hasCycle(ListNode head) { if (head == null || head.next == null) return false; ListNode slow = head; ListNode fast = head.next;2021-01-18 23:04:3437
0
-
原创 力扣206_反转链表
反转链表 描述:反转一个单链表。 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 本文采用迭代的方法反转链表 基本思想:在遍历时,将当前结点的next指向前一个结点 出现的问题: 由于链表的单向,不知道前一个结点的地址 若改变当前结点的next值,后续结点的地址丢失 解决办法: 用prev、cur指针分别指向前驱和当前结点 将后继结点的地址存储在nextTemp当中 流程如下图所示(仅列出三2021-01-14 13:53:4418
0