算法训练Day15 | 102. 二叉树的层序遍历、107.二叉树的层次遍历 II、199. 二叉树的右视图、637. 二叉树的层平均值、429.N叉树的层序遍历......(还有许多题未做,待更新)
我新建的个人博客,欢迎访问:hmilzy.github.io
102. 二叉树的层序遍历题目链接:二叉树的层序遍历
创建一个队列,保存存进去的结点,每次记录队列大小,来进行循环出结点,放下一层结点。
12345678910111213141516171819202122232425262728293031323334353637383940414243/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.l ...
算法训练Day14 | 二叉树的递归遍历、二叉树的迭代遍历、二叉树的统一迭代法
我新建的个人博客,欢迎访问:hmilzy.github.io
二叉树的递归遍历(前序、中序、后序)每次写递归,都按照这三要素来写,可以保证大家写出正确的递归算法!
确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。
确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。
确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051// 前序遍历·递归·LC144_二叉树的前序遍历class Solution { public List<Integer> preor ...
算法训练Day13 | 239. 滑动窗口最大值、347. 前 K 个高频元素
我新建的个人博客,欢迎访问:hmilzy.github.io
239. 滑动窗口最大值题目链接: 滑动窗口最大值
创建一个单调队列,队列里放数组的下标位置遍历数组,若队列首的值不在窗口内,则从队首一直poll元素,直到满足若队列尾的元素小于当前遍历到的数组元素值,则不断将队尾元素移除然后将数组元素位置放入队列判断遍历到的地方是否大于等于k-1,来给结果数组赋值
123456789101112131415161718192021222324252627class Solution { public int[] maxSlidingWindow(int[] nums, int k) { Deque<Integer> deque = new LinkedList<Integer>(); int n = nums.length; int[] result = new int[n - k + 1]; for(int i = 0; i < n; i++){ ...
算法训练Day11 | 20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值
我新建的个人博客,欢迎访问:hmilzy.github.io
20. 有效的括号题目链接: 有效的括号
遍历整个字符串,若碰到任意一个左括号,则将对应的右括号放入栈中。若碰到的是右括号,若右括号和栈顶元素括号不相等,则直接返回false;若遍历中,发现栈里已经没有元素了,自然就不能再出栈,也返回false。(其实等同于右括号太多了的情况)若碰到右括号,且右括号与栈顶元素相互匹配,则将栈顶元素出栈。遍历完之后,要知道是否有多余的括号,则判断一下栈是否为空,若为空,则true。 (等同于左括号太多了的情况)有多种情况:
123456789101112131415161718192021222324class Solution { public boolean isValid(String s) { Deque<Character> deque = new LinkedList<>(); char ch; for (int i = 0; i < s.length(); i++) ...
算法训练Day10 | 232. 用栈实现队列、225. 用队列实现栈
我新建的个人博客,欢迎访问:hmilzy.github.io
232. 用栈实现队列题目链接: 用栈实现队列
这道题思路:若要进队列,直接进入栈即可。若要出队列,可以将入栈的元素全部放入出栈,然后返回出栈的pop()。记住在这之前要判断出栈是否有元素,如果有的话,直接返回出栈的pop,而不需要把入栈元素全部放入出栈中。查看peek同理。是否为空则要看入栈和出栈是否都空。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849class MyQueue { Stack<Integer> stackIn; Stack<Integer> stackOut; public MyQueue() { stackIn = new Stack<>(); stackOut = new Stack<>(); } public voi ...
算法训练Day09 | 28. 找出字符串中第一个匹配项的下标、459. 重复的子字符串
今日这两题是KMP经典题目。KMP主要应用在字符串匹配上。KMP的经典思想就是:当出现字符串不匹配时,可以记录一部分之前已经匹配的文本内容,利用这些信息避免从头再去做匹配。
我新建的个人博客,欢迎访问:hmilzy.github.io
28. 找出字符串中第一个匹配项的下标题目链接: 找出字符串中第一个匹配项的下标
1
459. 重复的子字符串题目链接: 重复的子字符串
1
算法训练Day08 | 344. 反转字符串、541. 反转字符串 II、剑指Offer 05.替换空格、151. 反转字符串中的单词、剑指 Offer 58 - II. 左旋转字符串
我新建的个人博客,欢迎访问:hmilzy.github.io
344. 反转字符串题目链接: 反转字符串
没什么好说的,左右指针往中间走就行了。
12345678910111213141516class Solution { public void reverseString(char[] s) { int left = 0; int right = s.length - 1; while(left <= right){ char temp = s[left]; s[left] = s[right]; s[right] = temp; left++; right--; } }}
541. 反转字符串 II题目链接: 反转字符串 II
自定义一个函数reverse,实现对字符数组任意区间的字符进行反转。主函数中for循环 i + ...
算法训练Day07 | 454. 四数相加 II、383. 赎金信、15. 三数之和、18. 四数之和
我新建的个人博客,欢迎访问:hmilzy.github.io
454. 四数相加 II题目链接: 四数相加 II
思路:1.分为两组,HashMap 存一组,另一组和 HashMap 进行比对。2.这样的话情况就可以分为三种:(1). HashMap 存一个数组,如 A。然后计算三个数组之和,如 BCD。时间复杂度为:O(n)+O(n^3),得到 O(n^3).(2). HashMap 存三个数组之和,如 ABC。然后计算一个数组,如 D。时间复杂度为:O(n^3)+O(n),得到 O(n^3).(3). HashMap存两个数组之和,如AB。然后计算两个数组之和,如 CD。时间复杂度为:O(n^2)+O(n^2),得到 O(n^2).3.根据第二点我们可以得出要存两个数组算两个数组。4.我们以存 AB 两数组之和为例。首先求出 A 和 B 任意两数之和 sumAB,以 sumAB 为 key,sumAB 出现的次数为 value,存入 hashmap 中。 然后计算 C 和 D 中任意两数之和的相反数 sumCD,在 hashmap 中查找是否存在 key 为 sumCD。 ...
算法训练Day06 | 242. 有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和
我新建的个人博客,欢迎访问:hmilzy.github.io
242. 有效的字母异位词题目链接: 有效的字母异位词
我自己想到的方法是,用HashMap,先遍历第一个字符串,字符存在key,个数存在value。然后遍历第二个字符串,每来一个字符,就把对应的value减一。如果最后个数小于0的话,就返回false。当然,在程序最开始的地方需要判断两个字符串长度是否相等,如果不相等,直接返回false。
1234567891011121314151617181920212223class Solution { public boolean isAnagram(String s, String t) { //用的hashmap,效率不太理想 if(s.length() != t.length()){ return false; } Map<Character,Integer> map = new HashMap<>(); ...
算法训练Day04 | 24. 两两交换链表中的节点、19. 删除链表的倒数第 N 个结点、面试题 02.07. 链表相交、142. 环形链表 II
我新建的个人博客,欢迎访问:hmilzy.github.io
24. 两两交换链表中的节点题目链接: 两两交换链表中的节点
方法一:同样设置虚拟头结点。这里需要操作的结点数很多,数四个分别为 cur、firstNode、secondNode、temp,判断循环结束的条件需要注意一下,避免出现空指针异常
12345678910111213141516171819202122232425262728293031323334/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * ...