随笔分类 - 算法
记录自己不大熟的LeetCode题目
摘要:题目链接 1. 两数之和 思路 使用 HashMap 来存储每个元素的下标及其所需要加和的数,遍历数组,检查每个数是否在 HashMap 中有对应的加和数,如果没有则把该数也加入 HashMap 中。 代码 class Solution{ public int[] twoSum(int[] nums
阅读全文
摘要:题目链接 735. 行星碰撞 思路 当分支情况太多的时候,使用 bool 变量来判断是否应该压入栈 代码 class Solution{ public int[] asteroidCollision(int[] asteroids){ Stack<Integer> stack = new Stack
阅读全文
摘要:题目链接 1249. 移除无效的括号 思路 定义数组 valid 来记录每个字符的合法性,定义栈 stack 来存储每个左括号的下标。遍历数组。 碰到字母直接 valid[i] = true。 碰到左括号则将索引压栈,valid[i] = true。 碰到右括号进行判断 如果栈不为空,则弹出栈顶元素
阅读全文
摘要:题目链接 1209. 删除字符串中的所有相邻重复项 II 思路 用栈存储 Pair<Character, Integer> ,整数表示该字符连续出现的次数。遍历字符串 s 将其中的字符 c 依次压入栈顶并判断: c 和栈顶元素相同,则其整数部分=栈顶整数部分+1,此时如果 c 的整数部分为 k 则进
阅读全文
摘要:题目链接 1472. 设计浏览器历史记录 思路 用栈 history 模拟网页的前进后退操作,用栈 temp 来暂时存储后退所退出的网页。 代码 class BrowserHistory{ Stack<String> history; Stack<String> temp; public Brows
阅读全文
摘要:题目链接 20. 有效的括号 思路 碰见左括号就入栈,碰见右括号就和检查栈顶括号是否配队。遍历完后还要检查栈是否为空,确定括号数量是合法的。 代码 class Solution{ public boolean isValid(String s){ Stack<Character> stack = n
阅读全文
摘要:题目链接 150. 逆波兰表达式求值 思路 从左到右遍历 tokens 遇到数字便放入栈中,遇到运算符便弹出栈顶的两个数字进行运算。 代码 class Solution{ public int evalRPN(String[] tokens){ Stack<Integer> numbers = ne
阅读全文
摘要:题目链接 155. 最小栈 思路 让栈中的每个结点都额外存储自己入栈时的栈中最小值。这样无论何时,永远能从栈顶元素取出当前栈中的最小值。 代码 class MinStack{ // key means the number, value means the minimal number Stack<
阅读全文
摘要:题目链接 54. 螺旋矩阵 思路 通过维护上下左右四个边界变量来控制循环。 代码 class Solution { public List<Integer> spiralOrder(int[][] matrix) { int firstRow = 0; int lastColumn = matrix
阅读全文
摘要:题目链接 232. 用栈实现队列 思路 设置一个主栈 mainStack 和一个辅助栈 assistantStack,在进行入队的时候,将 mainStack 中的元素全部放入 assistantStack 中,再将 x 入队,然后再将 assistantStack 的元素放入 mainStack
阅读全文
摘要:题目链接 225. 用队列实现栈 思路 设置一个主队列 mainQueue 和一个辅助队列 assistantQueue,在进行压栈的时候,将 mainQueue 中的元素全部放入 assistantQueue 中,再将 x 压栈,然后再将 assistantQueue 的元素放入 mainQueu
阅读全文
摘要:题目链接 328. 奇偶链表 思路 根据题意,我们只需要将扫描到的索引为奇数的结点不断插入到正确位置。 比如 1->2->3->4->5 ==》 1->3->2->4->5 ==》 1->3->5->2->4 在扫描过程中需要维护四个变量: lastOdd 表示已经到正确位置的最后一个奇数,在上方例
阅读全文
摘要:题目链接 92. 反转链表 II 思路 和【链表】LeetCode 206. 反转链表的思路一样,只不过需要调整一下realHead头结点的位置,同时原题中的null在本题中为rightNode的下一个结点。 注意: 如果left == 1则说明head结点也需要被反转,此时反转后的首结点为righ
阅读全文
摘要:题目链接 142. 环形链表 II 思路 代码 class Solution { public ListNode detectCycle(ListNode head) { if(head == null){ return null; } ListNode slow = head; ListNode
阅读全文
摘要:题目链接 141. 环形链表 思路 设置fast指针和slow指针,分别走两步和一步,如果链表有环的话,那么两个指针一定会在某一时刻相遇。 可以想象成速度不同的两个人跑圈,只要时间足够,速度慢的人一定会被速度快的人套圈。 代码 class Solution { public boolean hasC
阅读全文
摘要:题目链接 160. 相交链表 思路1 先测量两个链表的长度,记录差值k=abs(n1 - n2),然后让短的链表先走k步,这样就能保证剩下的长度是一样的,再同步遍历即可。 代码1 class Solution { public: ListNode *getIntersectionNode(ListN
阅读全文
摘要:题目链接 876.链表的中间结点 思路 定义两个指针fast和slow,快的指针一次走两步,慢的指针一次走一步,这样当快的指针走到底的时候,慢指针正好在中间。 以下两幅图说明了偶数结点下,不同循环条件对慢指针结束位置的影响。 代码 class Solution { public ListNode m
阅读全文
摘要:==排序过程中,对尚未确定最终位置的元素进行一遍处理,叫做“一趟”== 内部排序的比较 插入排序 思想: 如果自己前面的元素比自己大,那么开始比较更前面的元素,放在合适的位置。 void insertSort(int a[],int n){ int i, j; for(i = 1; i < n; +
阅读全文
摘要:题目链接 215. 数组中的第K个最大元素 思路 对于给定数组,求解第 $k$ 大元素,且要求线性复杂度,正解为使用「快速选择」做法。 基本思路与「快速排序」一致,每次敲定一个基准值 $x$,根据当前与 $x$ 的大小关系,将范围在 $[l,r]$ 的 $nums[i]$ 划分为到两边。 同时利用,
阅读全文
摘要:题目链接 75.颜色分类 思路 题目要求按0、1、2的顺序排序,因为数量有限,所以通过两次遍历,分别将0和1交换到合适的位置,这样两次遍历之后,剩下的2就都在尾部了。 circle 代表这一次要对哪个数字进行重置位置,所以它的取值就限定在0、1,因为当我们确定好0和1位置之后,2的位置也就确定好了。
阅读全文