- 博客(137)
- 收藏
- 关注
原创 动态规划--14-背包问题
有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?为方便讲解和理解,下面讲述的例子均先用具体的数字代入,即:eg:number=4,capacity=81、建立模型,即求max(V1X1+V2X2+…+VnXn);2、寻找约束条件,W1X1+W2X2+…+WnXn<capacity;x是0或1.3、寻找递推关系式,面对当前商品有两种可能性:dp(i,j)表示当前背包容量 j,前 i 个物品最佳组合对应的价值。 包的容量比该商
2022-04-13 11:00:48
870
原创 动态规划--13-编辑距离[困难]
力扣给你两个单词word1 和word2,请你计算出将word1转换成word2 所使用的最少操作数。你可以对一个单词进行如下三种操作:插入一个字符 删除一个字符 替换一个字符示例1:输入:word1 = "horse", word2 = "ros"输出:3解释:horse -> rorse (将 'h' 替换为 'r')rorse -> rose (删除 'r')rose -> ros (删除 'e')示例2:输入:word1...
2022-04-13 10:58:24
183
1
原创 动态规划--12-[剑]丑数[中等]
力扣力扣我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。示例:输入: n = 10输出: 12解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。说明:1是丑数。 n不超过1690。思路设dp[i]表示第i个丑数。设三个指针int p2=p3=p5=1。则有:class Solution {public: int nthUglyNumb...
2022-04-13 10:57:16
164
原创 动态规划--11-[剑]礼物的最大价值[中等]
力扣在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?示例 1:输入:[ [1,3,1], [1,5,1], [4,2,1]]输出: 12解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物思路设dp[i][j]为到达(i,j)时的最优解(最小值):...
2022-04-13 10:56:19
130
原创 动态规划--10-[剑]把数字翻译成字符串[中等]
力扣给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。示例 1:输入: 12258 输出: 5解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"提示:0 <= num < 2^31思路注意,x_(i-1)x_(i)
2022-04-13 10:52:50
65
原创 动态规划--09-[剑]剪绳子1[中等]
力扣力扣给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m-1] 。请问 k[0]*k[1]*...*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。示例 1:输入: 2 输出: 1 解释: 2 = 1 + 1, 1 × 1 = 1示例2:输入: 10 输出: 36 解释: 10 = 3 +.
2022-04-13 10:51:38
681
原创 动态规划--08-[剑]斐波那契数列[简单]
力扣写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:F(0) = 0, F(1)= 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例 1:输入:n = 2输出:1示例 2:输入:...
2022-04-13 10:50:21
873
原创 动态规划--07-最小路径和[中等]
力扣给定一个包含非负整数的 mxn网格grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。设dp[i][j]为到达(i,j)时的最优解(最小值):dp[i][j]=min( dp[i-1][j]+grid[i][j], dp[i][j-1]+grid[i][j] )。答案class Solution {public: int minPathSum(vector<vector<int>&...
2022-04-13 10:49:15
71
原创 动态规划--06-最长递增子序列[中等]
力扣给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。示例 1:输入:nums = [10,9,2,5,3,7,101,18]输出:4解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。示例 2:输入:nums = [0,1,0,3,2,3]输出:4示例 3:输入:nums
2022-04-13 10:48:10
112
原创 动态规划--05-三角形最小路径和[中等]
力扣给定一个三角形 triangle ,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。#include <iostream>#include <map>#include <string>#include <vector&.
2022-04-13 10:45:51
89
原创 动态规划--04-零钱兑换[中等]
力扣给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1。你可以认为每种硬币的数量是无限的。示例1:输入:coins = [1, 2, 5], amount = 11输出:3解释:11 = 5 + 5 + 1示例 2:输入:coins = [2], amount = 3输出:-1示例 3:输入:coins = [1], amount = 0输..
2021-09-18 10:06:45
109
原创 动态规划--04-零钱兑换2[中等]
力扣给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。假设每一种面额的硬币有无限个。示例 1:输入:amount = 5, coins = [1, 2, 5]输出:4解释:有四种方式可以凑成总金额:5=55=2+2+15=2+1+1+15=1+1+1+1+1示例 2:输入:amount = 3, coins = [2]输出:0解.
2021-09-18 10:06:06
84
原创 动态规划--03-最大子序和[简单]
力扣力扣给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。nums.size()>=1示例 1:输入:nums = [-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组[4,-1,2,1] 的和最大,为6 。示例 2:输入:nums = [1]输出:1示例 3:输入:nums = [0]输出:0示例 4:输入:nums = [-1]输出:-1示例 5...
2021-09-18 10:00:24
134
原创 动态规划--02-打家劫舍[中等]
力扣你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4 。.
2021-09-18 09:53:35
70
原创 动态规划--01-爬楼梯[简单]
力扣假设你正在爬楼梯。需要 n阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶示例 2:输入: 3输出: 3解释: 有三种方法可以爬到楼顶。1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶3. 2 阶 + 1 阶思路最简单的思路是回溯。但是效率太差,.
2021-09-18 09:51:26
149
原创 搜索--07-[剑]机器人的运动范围[中等]
力扣地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?示例 1:输入:m = 2, n = 3, k = 1 输出:3示例 2:输
2021-09-18 09:45:10
80
原创 搜索--06-[剑]矩阵中的路径[中等]
力扣力扣请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。[["a","b","c","e"],["s","f","c","s"],["a","d","e","e"]]但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据
2021-09-18 09:40:47
70
原创 搜索--05-[剑]二维数组中查找[中等]
力扣在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路以搜索5为例,观察可知,7的右边(包括7)所有列里面的数字都大于5,而10的下边(包括10)所有行的数字都大于5。因此将搜索范围从矩阵收缩到6个数字。搜索时建议从右下到左上进行搜索。即找到红色框后,进行搜索。class Solution {public: bool find.
2021-09-18 09:19:39
82
原创 搜索--03-火柴拼正方形[中等]
力扣还记得童话《卖火柴的小女孩》吗?现在,你知道小女孩有多少根火柴,请找出一种能使用所有火柴拼成一个正方形的方法。不能折断火柴,可以把火柴连接起来,并且每根火柴都要用到。输入为小女孩拥有火柴的数目,每根火柴用其长度表示。输出即为是否能用所有的火柴拼成正方形。示例1:输入: [1,1,2,2,2]输出: true解释: 能拼成一个边长为2的正方形,每边两根火柴。示例2:输入: [3,3,3,3,4]输出: false解释: 不能用所有火柴拼成一个正方形。..
2021-09-18 09:18:03
108
原创 搜索--02-单词接龙[困难]
力扣字典wordList 中从单词 beginWord和 endWord 的 转换序列 是一个按下述规格形成的序列:序列中第一个单词是 beginWord 。 序列中最后一个单词是 endWord 。 每次转换只能改变一个字母。 转换过程中的中间单词必须是字典wordList 中的单词。给你两个单词 beginWord和 endWord 和一个字典 wordList ,找到从beginWord 到endWord 的 最短转换序列 中的 单词数目 。如果不存在这样的转换序列,返回 ...
2021-09-18 09:14:47
1305
原创 搜索--01-岛屿数量[中等]
力扣给你一个由'1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例 1:输入:grid = [["1","1","1","1","0"],["1","1","0","1","0"],["1","1","0","0","0"],["0","0","0","0","0"]]输出:1示例 2:输入:grid = [.
2021-09-17 09:28:47
93
原创 哈希表与字符串--14-最长公共前缀[简单]
力扣编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串""。示例 1:输入:strs = ["flower","flow","flight"] 输出:"fl"示例 2:输入:strs = ["dog","racecar","car"] 输出:"" 解释:输入不存在公共前缀。思路先找到最短的单词,确定最长前缀的最大长度。再挨个搜索每个单词,形成答案即可。答案class Solution {public: string lo.
2021-09-17 09:26:10
169
原创 哈希表与字符串--13-[剑]字符串转换为整数[中等]
力扣力扣写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。注意:假如该
2021-09-17 09:25:25
156
原创 哈希表与字符串--12-[剑]左旋转字符串[简单]
力扣字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。示例 1:输入: s = "abcdefg", k = 2输出:"cdefgab"示例 2:输入: s = "lrloseumgh", k = 6输出:"umghlrlose"限制:1 <= k < s.length <= 10000思路前面的..
2021-09-17 09:24:30
60
原创 哈希表与字符串--11-[剑]翻转单词顺序[简单]
力扣力扣输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。示例 1:输入: "the sky is blue"输出:"blue is sky the"示例 2:输入: " hello world! "输出:"world! hello"解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。示例...
2021-09-17 09:23:48
60
原创 哈希表与字符串--10-[剑]第一个只出现一次的字符[简单]
力扣在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。示例1:s = "abaccdeff"返回 "b"示例2:s = ""返回 " "限制:0 <= s 的长度 <= 50000思路利用哈希表进行记录,记录出现次数。然后再按顺序扫描一遍s,遇到第一个出现次数为1的,输出即可。答案class Solution {public: char firstUniqChar(string s) {
2021-09-17 09:23:01
87
原创 哈希表与字符串--09-[剑]字符串的排列[中等]=04-12
力扣输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。示例:输入:s = "abc"输出:["abc","acb","bac","bca","cab","cba"]限制:1 <= s 的长度 <= 8思路深搜回溯。答案class Solution {private: vector<string> ret; void findRet(string s,int x) {.
2021-09-17 09:22:05
49
原创 哈希表与字符串--08-[剑]正则表达式匹配[困难]未完成
力扣力扣请实现一个函数用来匹配包含'. '和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"和"ab*a"均不匹配。示例 1:输入:s = "aa"p = "a"输出: false解释: "a" 无法匹配 "aa" 整个字符串。示例 2:输入:s = "aa"p = "a*"输
2021-09-17 09:21:26
122
原创 哈希表与字符串--07-[剑]替换空格[简单]
力扣请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 1:输入:s = "We are happy."输出:"We%20are%20happy."限制:0 <= s 的长度 <= 10000思路1开辟新string,复制过来,遇到空格粘贴%20即可。答案1class Solution {public: string replaceSpace(string s) { string ret;
2021-09-17 09:20:44
73
原创 哈希表与字符串--06-最小覆盖子串[困难]超时
力扣给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。注意:如果 s 中存在这样的子串,我们保证它是唯一的答案。示例 1:输入:s = "ADOBECODEBANC", t = "ABC"输出:"BANC"示例 2:输入:s = "a", t = "a"输出:"a"思路设置双指针进行查找。滑动窗口的思想:用i,j表示滑动窗口的左边界和右边界,通过改变i,
2021-09-17 09:19:12
94
原创 哈希表与字符串--05-重复的DNA序列[中等]
力扣所有 DNA 都由一系列缩写为 'A','C','G' 和 'T' 的核苷酸组成,例如:"ACGAATTCCG"。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。编写一个函数来找出所有目标子串,目标子串的长度为 10,且在 DNA 字符串 s 中出现次数超过一次。示例 1:输入:s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"输出:["AAAAACCCCC","CCCCCAAAAA"]示例 2:输入:s = "AAA.
2021-09-16 09:56:47
139
原创 哈希表与字符串--04-无重复字符的最长子串[中等]
力扣力扣给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。示例1:输入: s = "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: s = "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: s = "pwwkew"输出: 3解释: 因为无重复字符的最长子串是"wke",所以其长度为 3。 请注意,你的...
2021-09-16 09:54:48
63
原创 哈希表与字符串--03-字母异位词分组[中等]
力扣给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。示例:输入: ["eat", "tea", "tan", "ate", "nat", "bat"]输出:[["ate","eat","tea"],["nat","tan"],["bat"]]说明:所有输入均为小写字母。 不考虑答案输出的顺序。思路给所有输入由小到大排序,作为key,value从0顺序增大生成。每次遇到相同的key,就可以找分组,将单词进行添
2021-09-16 09:53:41
76
原创 哈希表与字符串--02-单词规律[简单]
力扣给定一种规律 pattern和一个字符串str,判断 str 是否遵循相同的规律。这里的遵循指完全匹配,例如,pattern里的每个字母和字符串str中的每个非空单词之间存在着双向连接的对应规律。示例1:输入: pattern = "abba", str = "dog cat cat dog"输出: true示例 2:输入:pattern = "abba", str = "dog cat cat fish"输出: false示例 3:...
2021-09-16 09:52:46
99
原创 哈希表与字符串--01-最长回文串[简单]
力扣给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如"Aa"不能当做一个回文字符串。注意:假设字符串的长度不会超过 1010。示例 1:输入:"abccccdd"输出:7解释:我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。思路观察可知,用单个字符的奇偶即可寻找最长回文串。对于个数为偶数的字符,全部在回文串中。对于奇数个的,由小到大排列。第一个做回文中新的字符,其他..
2021-09-16 09:51:29
202
原创 哈希表与字符串--01-两数之和
力扣方法一:暴力。#include <iostream>#include <vector>using namespace std;void printVector(vector<int> &v) //引用传递 减少值传递方式的拷贝时间{ //定义了一个名为it的变量,它的数据类型是由vector<int>定义的iterator类型 for (vector<int>::iterator it = v.begi
2021-09-16 09:50:32
99
原创 二叉搜索树与二分查找--10-[剑]二叉搜索树的第K大节点[简单]
力扣给定一棵二叉搜索树,请找出其中第k大的节点。思路思路非常直接,由二叉搜索树的性质可知,其中序遍历就是递增遍历结果,则右根左是递减序列,称为逆中序遍历。因此在 逆中序遍历 中计数第k个遍历到的节点即可。答案class Solution {private: vector<int> v; void midOrder(TreeNode* node,int k){ if(!node||v.size()==k) retu
2021-09-16 09:48:57
53
原创 二叉搜索树与二分查找--09-[剑]缺失的数字[简单]
力扣一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。示例 1:输入: [0,1,3]输出: 2示例2:输入: [0,1,2,3,4,5,6,7,9]输出: 8限制:1 <= 数组长度 <= 10000思路已知数组nums长度为n-1,数字范围在[0,n-1]中。因此可用二分查找。如果查找的数字对应下标==下标所对应的数字,则寻找的数在.
2021-09-16 09:48:14
67
原创 二叉搜索树与二分查找--08-[剑]旋转数组的最小数字[简单]
力扣力扣把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组[3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。示例 1:输入:[3,4,5,1,2]输出:1示例 2:输入:[2,2,2,0,1]输出:0思路最直观的思路是从前到后扫描,遇到递减就找到了最小值。时间复杂度为O(n)。但这显然没有用到旋转数组的性质。class Solu...
2021-09-16 09:47:36
57
原创 二叉搜索树与二分查找--06-序列化和反序列化二叉搜索树[中等]
力扣序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建。设计一个算法来序列化和反序列化 二叉搜索树 。 对序列化/反序列化算法的工作方式没有限制。 您只需确保二叉搜索树可以序列化为字符串,并且可以将该字符串反序列化为最初的二叉搜索树。编码的字符串应尽可能紧凑。示例 1:输入:root = [2,1,3]输出:[2,1,3]示例 2:输入:root = []输出:[]
2021-09-16 09:42:50
64
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人