随笔分类 - 算法与数据结构
【LeetCode动态规划#05】背包问题的理论分析(基于代码随想录的个人理解,多图)
摘要:背包问题 问题描述 背包问题是一系列问题的统称,具体包括:01背包、完全背包、多重背包、分组背包等(仅需掌握前两种,后面的为竞赛级题目) 下面来研究01背包 实际上即使是最经典的01背包,也不会直接出现在题目中,一般是融入到其他的题目背景中再考察 因为是学习原理,所以先跳过最原始的问题模板来学。 0
【LeetCode二叉树#02】二叉树层序遍历(广度优先搜索),十合一专题
摘要:### 二叉树层序遍历(广度优先搜索) #### 102 二叉树的层序遍历 [力扣题目链接(opens new window)](https://leetcode.cn/problems/binary-tree-level-order-traversal/) 给你一个二叉树,请你返回其按 层序遍历
【LeetCode二叉树#01】二叉树的遍历(递归/迭代)
摘要:二叉树递归遍历 写递归算法时候需要遵循的三个点: 确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。 确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条
【LeetCode二叉树#00】二叉树的基础知识
摘要:基础知识 分类 满二叉树 如果二叉树中除了叶子结点,每个结点的度都为 2,则此二叉树称为满二叉树。 完全二叉树 除了底层外,其他部分是满的,且底层从左到右是连续的,称为完全二叉树 满二叉树一定是完全二叉树 举个例子: 完全二叉树 1 / \ 2 3 / \ / \ 4 5 6 不是完全二叉树 1 /
【LeetCode栈与队列#06】前K个高频元素(TopK问题),以及pair、priority_queue的使用
摘要:前 K 个高频元素 力扣题目链接(opens new window) 给定一个非空的整数数组,返回其中出现频率前 k 高的元素。 示例 1: 输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2: 输入: nums = [1], k = 1 输出: [1] 提
【LeetCode栈与队列#05】滑动窗口最大值
摘要:滑动窗口最大值 力扣题目链接(opens new window) 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 进阶: 你能在线性时间复杂度内解决此题吗? 提示:
【LeetCode栈与队列#01】队列的基本操作:用栈模拟队列和用队列模拟栈
摘要:用栈实现队列 力扣题目链接(opens new window) 使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部。 pop() -- 从队列首部移除元素。 peek() -- 返回队列首部的元素。 empty() -- 返回队列是否为空。 示例: MyQueue queue
【LeetCode字符串#06】KMP巩固练习:重复子串
摘要:重复的子字符串 力扣题目链接(opens new window) 给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。 示例 1: 输入: "abab" 输出: True 解释: 可由子字符串 "ab" 重复两次构成。 示例 2:
【LeetCode字符串#05】基于个人理解的KMP算法图解,以及应用到strStr()函数实现
摘要:KMP算法(用于实现 strStr()) strStr()函数是用来在一个字符串中搜索是否存在另一个字符串的函数,其匹配字符串方式为KMP算法 KMP算法基础理论 假设有如下两个字符串 文本串 aabaabaaf 模式串 aabaaf 我们希望在文本串中匹配出模式串 Intro 暴力法 使用两层fo
【Java复健指南03】递归思想
摘要:【递归】 递归重要规则 1.执行一个方法时,就创建一个新的受保护的独立空间(栈空间) 方法的局部变量是独立的,不会相互影响,比如n变量 如果方法中使用的是引用类型变量(比如数组,对象),就会共享该引用类型的数据. 递归必须向退出递归的条件逼近,否则就是无限递归,出现栈溢出(StackOverflow
【Java复健指南01】简介与数组
摘要:写在最前 学习Java已经是很久之前的事情了,因为技术栈的转变,很久没有使用Java正经地开发过项目。 对于该语言的理解也是停留在表面,因此萌生了重新学习的念头。一方面是为刷算法题打基础,另一方面也是想拓展一下自己的技术栈(要不然失业了都) 既然我的目标是“复健”,那么显然不可能完全重新学习记录一遍
【LeetCode数组相关】中心下标、旋转图像、零矩阵
摘要:LeetCode724.寻找数组的中心下标 给你一个整数数组 nums ,请计算数组的 中心下标 。 数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。 如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端
【算法day6】哈希表、有序表、链表(反转单链表)
摘要:哈希表的简单介绍 1)哈希表在使用层面上可以理解为一种集合结构 2)如果只有key,没有伴随数据value,可以使用HashSet结构(C++中叫UnOrderedSet) 3)如果既有key,又有伴随数据value,可以使用HashMap结构(C++中叫UnOrderedMap) 4)有无伴随数据
【算法day5】排序算法的稳定性及其汇总
摘要:稳定性 定义:值相同的元素在排序完成之后能否保证原有的次序不变(同样值的个体之间,如果不因为排序而改变相对次序,这个排序就是有稳定性的,否则就没有) 举例: [2,1,3,1]-->[1,1,2,3] ① ② ① ② 在排完序后,第一个1和第二个1的次序还是一样的 在基础数组中,排序的稳定性用处不大
【算法day4】堆结构、堆排序、比较器以及桶排
摘要:堆与堆结构(优先级队列结构) 知识点: 堆结构就是用数组实现的完全二叉树结构 完全二叉树中如果每棵子树的最大值都在顶部就是大根堆 完全二叉树中如果每棵子树的最小值都在顶部就是小根堆 堆结构的heaplnsert与heapify操作 堆结构的增大和减少 优先级队列结构,就是堆结构 一段连续的数组是可以
【算法day3】小和、荷兰国旗、快排
摘要:小和问题 现有数组[1,3,4,2,5] 1左边是0(小于1),所以1的小和为0 3左边是1(小于3),所以3的小和为1 4左边是1、3(均小于4),所以4的小和为1+3=4 2左边是1、3、4(只有1小于2),所以2的小和为1 5左边是1、3、4、2(均小于5),所以5的小和为1+3+4+2=10
【算法day2】复杂度和简单排序算法(2)
摘要:插入排序 有以下数组 数组:[2,4,3,6,1] 序号:[0,1,2,3,4] 第一次排序(范围0~0):2左边没东西,不动 第二次排序(范围0~1):4左边是2,4大不动 第三次排序(范围0~2):3左边是4,移动,再左边是2,3大不动 第四次排序(范围0~3):以此类推,直到排序结束 这个过程
【算法day1】复杂度和简单排序算法(1)
摘要:复杂度和简单排序算法 时间复杂度 以一个排序(选择排序)操作举例 假设我有一个数组,我要找出其中的最小值放到0的位置上 那么 第一次我会遍历数组中N个数(在0位置处),找出最小的数交换到0位置【看了(寻址)N次,比较N次,一次交换】 第二次我会看遍历数组中N-1个数(在1位置处),找出最小的数交换到