算法复习
文章平均质量分 70
sueong
这个作者很懒,什么都没留下…
展开
-
翻转单词/Maxqueue/二次树的序列化和反序列化
区别于 https://leetcode.cn/problems/reverse-words-in-a-string/Reverse.pyMaxqueue.cpp实习maxqueue区别于 https://leetcode.cn/problems/dui-lie-de-zui-da-zhi-lcof/https://blog.csdn.net/ly0724ok/article/details/118966507二叉树的序列化和反序列化https://leetcode.cn/problems/h5原创 2022-07-14 00:56:10 · 81 阅读 · 0 评论 -
动态规划:完全背包、零钱兑换 II、组合总和 Ⅳ、爬楼梯进阶、零钱兑换、完全平方数
https://www.programmercarl.com/%E8%83%8C%E5%8C%85%E9%97%AE%E9%A2%98%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80%E5%AE%8C%E5%85%A8%E8%83%8C%E5%8C%85.html#%E5%AE%8C%E5%85%A8%E8%83%8C%E5%8C%85对于一维dp如果求组合数就是外层for循环遍历物品,内层for遍历背包。如果求排列数就是外层for遍历背包,内层for循环遍历物品。注:dp[j]:原创 2022-07-13 00:43:32 · 162 阅读 · 0 评论 -
动态规划:目标和/一和零
思路:既然为target,那么就一定有 left组合 - right组合 = target。left + right等于sum,而sum是固定的。公式来了, 。target是固定的,sum是固定的,left就可以求出来。此时问题就是在集合nums中找出和为left的组合。再回归到01背包问题,为什么是01背包呢?因为每个物品(题目中的1)只用一次!这次和之前遇到的背包问题不一样了,之前都是求容量为j的背包,最多能装多少。本题则是装满有几种方法。其实这就是一个组合问题了。1确定dp数组以及下标的含义 d原创 2022-07-11 23:42:11 · 160 阅读 · 0 评论 -
负数+0+正数
一堆负数+一堆0+一堆正数找最后一个出现的负数和第一个出现的正数的下标def findnum(nums): res = [] for i in range(len(nums)): # 如果全是0 边界 if nums[0] == 0 and nums[-1] == 0: return 0, 0 # 记录0的下标 elif nums[i] == 0: # 因为数字从下标1开始原创 2022-05-30 20:11:04 · 148 阅读 · 0 评论 -
回溯-排列问题/全排列I II
46.全排列这里和77.组合问题 (opens new window)、131.切割问题 (opens new window)和78.子集问题 (opens new window)最大的不同就是for循环里不用startIndex了。因为排列问题,每次都要从头开始搜索,例如元素1在[1,2]中已经使用过了,但是在[2,1]中还要再使用一次1。 就是每一层可以重复 树枝上的路径的数不可以重复而used数组,其实就是记录此时path里都有哪些元素使用了,一个排列里一个元素只能使用一次。不用used判原创 2022-05-15 17:34:08 · 168 阅读 · 0 评论 -
回溯-子集问题/子集I II/递增子序列
78.子集class Solution(object): def subsets(self, nums): """ :type nums: List[int] :rtype: List[List[int]] """ path = [] res = [] def backtracking(nums, startindex): res.append(path[:]原创 2022-05-15 16:07:07 · 131 阅读 · 0 评论 -
回溯-切割问题:分割回文串/复原IP地址
131分割回文串在代码里什么是切割线呢?递归参数需要传入startIndex,表示下一轮递归遍历的起始位置,这个startIndex就是切割线。class Solution: def partition(self, s: str) -> List[List[str]]: path = [] res = [] def is_parlindrome(s, start, end): i = start原创 2022-05-14 21:29:47 · 141 阅读 · 0 评论 -
回溯-组合问题/组合/组合总和一二三/电话号码字母组合
回溯基础回溯法解决的问题?组合问题:N个数里面按一定规则找出k个数的集合切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合条件的子集排列问题:N个数按一定规则全排列,有几种排列方式棋盘问题:N皇后,解数独等等组合是不强调元素顺序的,排列是强调元素顺序组合无序,排列有序8回溯法一般是在集合中递归搜索,集合的大小构成了树的宽度,递归的深度构成的树的深度`。回溯搜索的遍历过程void backtracking(参数) { if (终止条件) {原创 2022-05-14 16:44:22 · 102 阅读 · 0 评论 -
单调栈-每日温度/接雨水/下一个更大元素/柱状图中的最大矩形
单调栈什么时候用?通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置。是什么?本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素的元素,优点是只需要遍历一次。时间复杂度是O(n)存什么?存放元素的下标i,栈头到栈底的顺序,递增循序739. 每日温度参考:https://www.programmercarl.com/0739.%E6%AF%8F%E6%97%A5%E6%B8%A9%E5%BA%A6.html#%E6%80%9D%E8%B7%A原创 2022-05-11 01:13:13 · 107 阅读 · 0 评论 -
大数加法/大数乘法/岛屿问题dfs
大数相加## 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可## 计算两个数之和# @param s string字符串 表示第一个整数# @param t string字符串 表示第二个整数# @return string字符串#class Solution: def solve(self , s: str, t: str) -> str: # write code here # 进位 carry原创 2022-05-07 20:08:44 · 270 阅读 · 0 评论 -
二叉树左下角值/路径总和
513.找树左下角的值那么如果找最左边的呢?可以使用前序遍历,这样才先优先左边搜索,然后记录深度最大的叶子节点,此时就是树的最后一行最左边的值。# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.rig原创 2022-05-01 02:37:12 · 462 阅读 · 0 评论 -
二叉树深度/结点/高度/路径/回溯/左子树之和/左下角的值
104.二叉树的最大深度![在这里插入图片描述](https://img-blog.csdnimg.cn/547bff671a3c4e95af46ce6db0b6dceb.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAc3Vlb25n,size_20,color_FFFFFF,t_70,g_se,x_16)递归后序# Definition for a binary tree node.# cl原创 2022-04-25 23:00:52 · 783 阅读 · 0 评论 -
求二叉树的属性-对称/翻转
226. 翻转二叉树翻转过程:交换左右孩子**前序遍历(深度优先) **# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.right = rightclass Solution: de原创 2022-04-15 21:42:38 · 421 阅读 · 0 评论 -
二叉树-层次遍历
二叉树的层序遍历,就是图论中的广度优先搜索在二叉树中的应用,需要借助队列来实现(此时又发现队列的一个应用了)。102.二叉树的层序遍历# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.right =原创 2022-04-14 23:32:20 · 2891 阅读 · 0 评论 -
二叉树-前中后递归/迭代遍历
二叉树的理论基础参考https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html二叉树的定义struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {}}; class T原创 2022-04-14 21:31:57 · 437 阅读 · 0 评论 -
栈与队列-
20. 有效的括号给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。示例 1:输入:s = “()” 输出:true示例 2:输入:s = “()[]{}” 输出:true示例 3:输入:s = “(]” 输出:false示例 4:输入:s = “([)]” 输出:false示例 5:输入:s = “{[]}” 输出:true第一种情况:已经遍历原创 2022-04-08 23:50:22 · 687 阅读 · 0 评论 -
字符串-kmp
KMPnextnext数组就是一个前缀表(prefix table)。前缀表有什么作用呢?前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。匹配过程要在文本串:aabaabaafa 中查找是否出现过一个模式串:aabaaf。可以看出,文本串中第六个字符b 和 模式串的第六个字符f,不匹配了。如果暴力匹配,会发现不匹配,此时就要从头匹配了。但如果使用前缀表,就不会从头匹配,而是从上次已经匹配的内容开始匹配,找到了模式串中第三个字符b继续开始匹原创 2022-04-06 23:14:24 · 161 阅读 · 0 评论 -
字符串--双指针/反转系列
344. 反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。示例 1:输入:s = [“h”,“e”,“l”,“l”,“o”] 输出:[“o”,“l”,“l”,“e”,“h”]示例 2:输入:s = [“H”,“a”,“n”,“n”,“a”,“h”] 输出:[“h”,“a”,“n”,“n”,“a”,“H”]来源:力扣(LeetCode)链接:http原创 2022-04-06 17:42:34 · 196 阅读 · 0 评论 -
哈希表-map(对于python来说是字典)
1. 两数之和给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] ==9 ,返回 [0, 1] 。示例 2:输入:nums = [3,2,4], t原创 2022-04-05 00:14:56 · 200 阅读 · 0 评论 -
5哈希表-set/数组
在C++中,set 和 map 分别提供以下三种数据结构,其底层实现以及优劣如下表所示参考:https://programmercarl.com/%E5%93%88%E5%B8%8C%E8%A1%A8%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html#%E5%93%88%E5%B8%8C%E5%87%BD%E6%95%B0242. 有效的字母异位词给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。注意:若 s 和 t 中每个字符出现的次数原创 2022-03-31 23:08:28 · 1054 阅读 · 0 评论 -
链表-虚拟头结点
链表基础C/C++的定义链表节点方式// 单链表struct ListNode { int val; // 节点上存储的元素 ListNode *next; // 指向下一个节点的指针 ListNode(int x) : val(x), next(NULL) {} // 节点的构造函数};C++默认生成一个构造函数。通过自己定义构造函数初始化节点:ListNode* head = new ListNode(5);使用默认构造函数初始化节点:ListNo原创 2022-03-29 22:47:19 · 2281 阅读 · 0 评论 -
数组-二分法
35. 搜索插入位置给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。示例 1:输入: nums = [1,3,5,6], target = 5 输出: 2示例 2:输入: nums = [1,3,5,6], target = 2 输出: 1示例 3:输入: nums = [1,3,5,6], target = 7 输出: 4 class Solution:原创 2022-03-29 19:25:00 · 80 阅读 · 0 评论 -
4数组-简单模拟-螺旋矩阵 II/ 顺时针打印矩阵
59. 螺旋矩阵 II给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。示例 1:输入:n = 3 输出:[[1,2,3],[8,9,4],[7,6,5]]示例 2:输入:n = 1 输出:[[1]]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/spiral-matrix-ii著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。左闭右原创 2022-03-29 17:55:03 · 99 阅读 · 0 评论 -
3数组-滑动窗口-长度最小的子数组/ 水果成篮/最小覆盖子串/替换后的最长重复字符
209. 长度最小的子数组给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。示例 1:输入:target = 7, nums = [2,3,1,2,4,3] 输出:2解释:子数组 [4,3] 是该条件下的长度最小的子数组。示例 2:输入:target = 4, nums = [1,4,4]原创 2022-03-28 23:30:33 · 433 阅读 · 0 评论 -
回溯、状态空间树
状态空间树蒙特卡罗 找到一定范围的解 一定能在这个范围内找到解拉斯维加斯 找到精确的解 但是解不一定正确因为每个背包都有选还是不选两种选择n皇后 不同行不同列 不在同一对角线xi表示的是列号判断k行皇后是否可以放在i列上面子集合数问题哈密顿环节 图着色问题相邻的图连起来就可以回溯法和分支界限法的异同...原创 2021-12-15 01:40:15 · 1276 阅读 · 0 评论 -
4回溯法、空间状态树
回溯 <---->递归1.递归的下面就是回溯的过程2.回溯法是一个 纯暴力的 搜索3.回溯法解决的问题:3.1组合 如:1234 两两组合3.2切割问题 如:一个字符串有多少个切割方式 ,或者切割出来是回文3.3子集 : 1 2 3 4 的子集3.4排列问题(顺序)3.5棋盘问题:n皇后 解数独4.回溯可抽象成树形结构树的宽度是集合的数目 for循环树的深度是递归的层数5.void backtracking(){进入终止条件后开始if(终止条件) {原创 2021-12-15 01:38:51 · 6111 阅读 · 1 评论 -
3递归式的三种方法
递归的概念递归函数用函数自身给出定义的函数递归算法一个算法包含对自身的调用(直接或间接调用)整数划分问题:将正整数n表示成一系列正整数之和:n=n1+n2+…+nk,其中n1≥n2≥…≥nk≥1,k≥1正整数n的这种表示称为正整数n的划分正整数n的不同的划分个数称为正整数n的划分数p(n)目标:求正整数n的不同划分个数p(n)思路:我们假设函数f(n,m)n为要整数划分的数,m为划分中出现的最大加数且加数都是大于等于1,可以是一个加数即自己本身p(6)=1165+14+原创 2021-12-12 17:36:30 · 2467 阅读 · 0 评论 -
1算法基本概念
算法定义确定性能行性输入输出有穷性计算过程:满足前四条不满足有穷性OS就是计算过程算法好坏的衡量尺度问题的规模 :输入数据量的测度基本运算:两个实矩阵的乘法:实数的乘法(及加法);数表的排序:表中的两个数据项进行比较算法的计算量函数算法的计算量函数时间复杂性问题规模的某个函数来表示算法的基本运算量,这个表示基本运算量的函数表示渐近时间复杂性的三个记号T(n)=O(f(n))T(n)=Ω(f(n))T(n)=Θ(f(n)T(n)= O(f(n)):若存在c原创 2021-12-07 18:24:15 · 868 阅读 · 0 评论