随笔分类 - 代码随想录
“代码随想录”的学习记录
摘要:1. 二叉树 /** * 102. BinaryTree的层序遍历(借助辅助队列实现,递归法pass) * @param root * @return */ public List<List<Integer>> levelOrder(TreeNode root) { List<List<Intege
阅读全文
摘要:栈与队列: /** * 20. 有效的括号 * @param s * @return */ public boolean isValid(String s) { Deque<Character> deque = new LinkedList<>(); for (int i = 0; i < s.le
阅读全文
摘要:数组: /** * 209. 长度最小的子数组 * * @param target 正整数 * @param nums 含有 n 个正整数的数组 * @return 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组,并返回其长度。如果不存在符合条件的子数组,返回 0 。 */ pub
阅读全文
摘要:动规: /** * 70. 爬楼梯 * @param n * @return */ public int climbStairs(int n) { if (n <= 2) { return n; } int[] dp = new int[n]; dp[0] = 1; dp[1] = 2; for (
阅读全文
摘要:二叉树: /** * 迭代法实现中序前序后序遍历 * @param root * @return */ public List<Integer> preorderTraversalIterator(TreeNode root) { List<Integer> result = new ArrayLi
阅读全文
摘要:字符串: /** * 541. 反转字符串 II * @param s * @param k * @return */ public String reverseStr(String s, int k) { StringBuilder res = new StringBuilder(); int l
阅读全文
摘要:数组: /** * 27. 移除元素 * @param nums * @param val * @return 很多考察数组、链表、字符串等操作的面试题,都使用双指针法。 */ public int removeElement(int[] nums, int val) { int left = 0;
阅读全文
摘要:贪心算法: /** * 455. 分发饼干 * @param g * @param s * @return */ public int findContentChildren(int[] g, int[] s) { // 优先考虑胃口,先喂饱大胃口 Arrays.sort(g); Arrays.so
阅读全文
摘要:栈和队列: /** * 232. 用栈实现队列 * 队列的先进先出可以使用两个栈stackIn和stackOut来实现; * 出队列前,如果 stackOut 不为空,表示队列当前值在上一轮已进入 stackOut 中,还没有被消费掉 * 若 stackOut 为空,也就是队列当前值还在 stack
阅读全文
摘要:数组: /** * 704. 二分查找 * @param nums 升序无重复的整型数组 * @param target 目标值 * @return 函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1 */ public int search(int[] nums, in
阅读全文
摘要:栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能)。 力扣232. 用栈实现队列 用两个栈实现队列的先进先出。 力扣225. 用队列实现栈 队列是先进先出的规则,使用辅助队列,每次将压栈数据先存入辅助队列,后移动到另一队列中,实现
阅读全文
摘要:力扣344.反转字符串 力扣541. 反转字符串II 力扣05. 替换空格 很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。 这么做有两个好处: 不用申请新数组。 从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。
阅读全文
摘要:哈希结构:数组、set(集合)、map(映射) 哈希法:当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。 ① 当我们要使用set(集合)来解决哈希问题的时候: 1)优先使用unordered_set,因为它的查询和增删效率是最优的(底层哈希表,无序,不可重复
阅读全文
摘要:力扣203. 移除链表元素 力扣707. 设计链表 已经覆盖了链表的常见操作,是练习链表操作非常好的一道题目; 力扣206. 反转链表 再定义一个新的链表,实现链表元素的反转,是对内存空间的浪费。 1、只需要使用双指针,改变链表的next指针的指向,直接将链表反转 ,而不用重新定义一个新的链表。 2
阅读全文
摘要:力扣704. 二分查找 1.首先考虑边界问题,是左开右闭还是左闭右开; 2.在不同情况下,判断循环结束的条件,可以将左右边界带入区间是否合法来判断; 3.闭区间包含中间值,在确定下一区间时,要去掉已经判断过的这个值,开区间则不需要。 力扣27. 移除元素 双指针可以很好的解决这类问题,时间复杂度一般
阅读全文
摘要:1. 使用哈希法一般选择三种数据结构:数组、Set、Map; 优先使用 unordered_set(查询和增删的效率最优),如果需要集合有序则使用 set,如果要求不仅有序还有重复数据则使用 multiset; set、multiset 底层符号表使用红黑树来存储数据,但是依然是使用哈希函数来做映射
阅读全文
摘要:链表是一种通过指针串联在一起的线性结构,每一个结点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个结点的指针域指向null(空指针的意思)。 1. 链表基础 单链表:指针域只指向结点的下一个结点。 双链表:每一结点有两个指针域,一个指向下一个结点,一个指向上一个结点(双向
阅读全文
摘要:1. 二分查找 两种形式的二分查找:左闭右闭区间、左闭右开区间(建议直接看卡尔老师的视频讲解:https://www.bilibili.com/video/BV1fA4y1o715?vd_source=5ef7d01cc7c9eb5bb98fe55c698858e6) 2. 移除元素 双指针、相向双
阅读全文
摘要:算法的性能分析概括成时间复杂度和空间复杂度两部分; 1. 时间复杂度 通常指算法运行的时间(大O记法只保留最高次项,忽略低次项和常数项) 2. 空间复杂度 通常指算法在运行过程中占用内存空间大小,记做S(n)=O(f(n))。 O(1):随着n的变化,所需开辟的内存空间并不会随着n的变化而变化,即算
阅读全文