自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(32)
  • 收藏
  • 关注

原创 K 站中转内最便宜的航班(bfs最短路)

787. K 站中转内最便宜的航班有 n 个城市通过一些航班连接。给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,以价格 pricei 抵达 toi。现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是找到出一条最多经过 k 站中转的路线,使得从 src 到 dst 的 价格最便宜 ,并返回该价格。 如果不存在这样的路线,则输出 -1。思路不能直接用dijistra或者spfa用

2021-09-23 19:58:26 175

原创 分割数组的最大值+完成所有工作的最短时间(二分答案)

问题描述给定一个非负整数数组 nums 和一个整数 m ,你需要将这个数组分成 m 个非空的连续子数组。设计一个算法使得这 m 个子数组各自和的最大值最小。思路最大值最小,典型的二分,关键在于如何写check函数假设x是最大值的最小值,首先先不考虑最小值这个后缀,即x至少要满足可以将数组连续分成m个和不超过x的连续子数组根据这句话我们有两种判断方法1.把数组分成全部小于x的连续子数组最少可以分成cnt组(即每一组都尽量恰好不超过x的分),则cnt必须满足m>=cnt2.把数组分成m

2021-09-06 22:22:08 356

原创 单调栈模板

问题描述长方形小明今天突发奇想,想从一张用过的纸中剪出一个长方形。为了简化问题,小明做出如下规定:(1)这张纸的长宽分别为 n,mn,m。小明讲这张纸看成是由n\times mn×m个格子组成,在剪的时候,只能沿着格子的边缘剪。(2)这张纸有些地方小明以前在上面画过,剪出来的长方形不能含有以前画过的地方。(3)剪出来的长方形的大小没有限制。小明看着这张纸,想了好多种剪的方法,可是到底有几种呢?小明数不过来,你能帮帮他吗?思路单调栈适合解决在一个连续区间内找左边和右边第一个比它小/大的元素,

2021-08-18 17:15:38 174

原创 浮点数二分答案+单调队列维护定长区间最值

问题描述一个含有 nn 项的数列,求出每一项前的 mm 个数到它这个区间内的最小值。若前面的数不足 mm 项则从第 11 个数开始,若前面没有数则输出 00。P1440 求m区间内的最小值代码#include <iostream>#define maxn 100010using namespace std;int n,s,t;double l,r,mid,ans,a[maxn],b[maxn],sum[maxn];// sum[i]-min(sum[i-t]~sum[i-s])&

2021-08-14 17:41:46 116

原创 lc403.青蛙过河

问题重述一只青蛙想要过河。 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有)。 青蛙可以跳上石子,但是不可以跳入水中。给你石子的位置列表 stones(用单元格序号 升序 表示), 请判定青蛙能否成功过河(即能否在最后一步跳至最后一块石子上)。开始时, 青蛙默认已站在第一块石子上,并可以假定它第一步只能跳跃一个单位(即只能从单元格 1 跳至单元格 2 )。如果青蛙上一步跳跃了 k 个单位,那么它接下来的跳跃距离只能选择为 k - 1、k 或 k + 1 个单位。

2021-06-15 22:27:47 114

原创 动态规划经典例题

恰好 和 不超过切割次数不超过k次和恰好切割k次的区别仅仅在于dp[i][j],j>=i时的定义不同,一个是无效值,一个是有效值(有点像背包要求装满或不要求转满时的最优解)所以装满和不要求装满,恰好k次和不超过k次的 主要递推式其实是一样的,区别只在于初始化时,对相关变量的赋值不同如果是恰好切割k次,则对于j>=i,即长度为i的钢管一定切不了大于长度i的j次,所以它是一个无效解,且因为要求价值最大,所以赋值无效值为-inf如果是切割次数不超过k次,则对于j>=i,即长度为i的钢管

2021-06-14 21:37:54 921

原创 凑零钱+最小字典序(逆序dp)

问题重述思路将零钱从大到小排序,先选择大的再选择小的代码#include<iostream>#include<vector>#include<algorithm>using namespace std;const int N = 10001;int dp[N];int v[N];bool choice[N][N];int cmp(int a, int b) { return a > b;}int main() { i

2021-05-26 20:57:52 117

原创 最长有效括号

问题重述给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。思路代码class Solution {public: int longestValidParentheses(string s) { int maxans = 0, n = s.length(); vector<int> dp(n, 0); for (int i = 1; i < n; i++) {

2021-05-24 19:31:34 68

原创 至多删三个字符

问题重述给定一个全部由小写英文字母组成的字符串,允许你至多删掉其中 3 个字符,结果可能有多少种不同的字符串?思路关键在于怎么去重!仍考虑每一个字符位置删还是不删。设dp[i][j]表示前i个字符删去j个字符获得的不同字符个数若第i个字符删了,则前i-1个字符删去j个字符dp[i-1][j-1]一定是不同的,因为这是之前已经算过的了若第i个字符不删,则就要小心了!!!!因为如果不删,相当于选一个前缀加上第i个字符组成新的字符串,若之前有一个和第i个字符相等的字符a=s[i],并且a和s[i]共

2021-05-23 23:25:47 570 1

原创 青蛙过桥 (逆序dp字典序)

问题重述一座长度为n的桥,起点的一端坐标为0,且在整数坐标i处有a[i]个石头【0<=a[i]<=4】, 一只青蛙从坐标0处开始起跳,一步可以跳的距离为1或2或3【即每一步都会落在整数点处】, 青蛙落在i处会踩着该点的所有石头,求青蛙跳出这座桥最少踩多少个石头?并且输出依次跳 过的坐标点路线,如果存在多种路线,输出字典序最小的那一条。思路正序dp无法输出字典序代码#include<iostream>#include<string.h>#include<

2021-05-23 14:17:43 561 4

原创 Apple Catching.(POJ-2385)

问题重述奶牛爱吃苹果是鲜为人知的事实。FJ在他的田地里有两棵苹果树(编号为1和2)。Bessie不会爬树,所以她必须等着苹果掉下来。然而,她必须在空中接住它们,因为苹果落地时碰伤了(谁也不想吃碰伤了的苹果)。Bessie吃得很快,吃的时间可以忽略不计。 每分钟,两棵苹果树中的一棵会掉落一个苹果。Bessie做过很多练习,只要她站在一棵有苹果落下的树下,就能接住一个苹果。Bessie可以很快地在两棵树之间行走,时间忽略不计。她可以随时站在一棵树下。此外,奶牛没有得到大量的锻炼,所以她不愿意在树间来回地来回行

2021-05-10 21:50:40 84

原创 lc554. 砖墙(hash)

问题重述你的面前有一堵矩形的、由 n 行砖块组成的砖墙。这些砖块高度相同(也就是一个单位高)但是宽度不同。每一行砖块的宽度之和应该相等。你现在要画一条 自顶向下 的、穿过 最少 砖块的垂线。如果你画的线只是从砖块的边缘经过,就不算穿过这块砖。你不能沿着墙的两个垂直边缘之一画线,这样显然是没有穿过一块砖的。给你一个二维数组 wall ,该数组包含这堵墙的相关信息。其中,wall[i] 是一个代表从左至右每块砖的宽度的数组。你需要找出怎样画才能使这条线 穿过的砖块数量最少 ,并且返回 穿过的砖块数量 。

2021-05-05 23:33:48 92

原创 lc740. 删除并获得点数(打家劫舍变题)

问题重述给你一个整数数组 nums ,你可以对它进行一些操作。每次操作中,选择任意一个 nums[i] ,删除它并获得 nums[i] 的点数。之后,你必须删除每个等于 nums[i] - 1 或 nums[i] + 1 的元素。开始你拥有 0 个点数。返回你能通过这些操作获得的最大点数。思路关键在于将nums数组转换成0->max的房子,每个房子里存的是nums[i]*count[i]的金钱(因为选了nums[i]则所有nums[i]-1和nums[i]+1全都被删除了,所以一个一个删nu

2021-05-05 23:04:02 93

原创 lc1473.粉刷房子III

问题重述思路代码#include <vector>using namespace std;class Solution {public: const int INF=INT_MAX/2; int minCost(vector<int>& houses, vector<vector<int>>& cost, int m, int n, int target) { for(int& c:

2021-05-04 15:21:57 115

原创 动态规划

1.钢管问题长为n的钢管如何截取获得的价值最大,p[i]为截取为i长度的钢管价值dp:dp[i]=max{p[j]+dp[i-len[j]]} (0<=len[j]<=i,0<=j<=n)先遍历背包容量再每次遍历j找第一次截取时的位置+剩下钢管的最大价值,有顺序{1,2,3},{3,1,2}算两种不同的方案dp[i][j]=max(dp[i-1][j],dp[i-1][j-len[i]]+p[i])先遍历物品个数变成背包问题,每次装或是不装第i个物品并且只考虑前i个.

2021-04-26 18:43:28 69

原创 lc377.组合总和

问题重述给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。题目数据保证答案符合 32 位整数范围。示例:输入:nums = [1,2,3], target = 4输出:7解释:所有可能的组合为:(1, 1, 1, 1)(1, 1, 2)(1, 2, 1)(1, 3)(2, 1, 1)(2, 2)(3, 1)请注意,顺序不同的序列被视作不同的组合。思路代码My 没有排列的简

2021-04-24 23:35:00 143

原创 lc386.最大整除子集

问题重述给你一个由 无重复正整数组成的集合 nums ,请你找出并返回其中最大的整除子集 answer ,子集中每一元素对 (answer[i], answer[j]) 都应当满足:answer[i] % answer[j] == 0 ,或answer[j] % answer[i] == 0如果存在多个有效解子集,返回其中任何一个均可。思路dp[i]表示nums前i个数字以nums[i]为结尾的最长整除子集,类似于最长递增子序列设的nums前i个数字中以nums[i]为结尾的最长递增子序列

2021-04-23 20:10:51 86

原创 lc363. 矩形区域不超过 K 的最大数值和

问题重述给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大数值和。题目数据保证总会存在一个数值和不超过 k 的矩形区域。思路代码class Solution {public: int maxSumSubmatrix(vector<vector<int>> &matrix, int k) { int ans = INT_MIN; int m = matrix.siz

2021-04-22 22:17:21 90

原创 lc删除排序数组的重复项(双指针)

问题重述给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。思路My:双指针遇到不同的把后面全部的元素移上来standard:双指针遇到不同的只用交换不同的两个值即可代码Standard:class Solution { public int removeDuplicates(int[] nums) { int n

2021-04-18 21:55:39 147

原创 lc220.存在重复元素(滑动窗口)

问题重述思路My:以每个下标i为起点,遍历终点j<=i+k,如果找到差的绝对值<=t则返回真(超时!!!QAQ)Standard:代码My:class Solution {public: bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) { bool flag=false; for(int i=0;i<nums.size();

2021-04-17 21:34:44 115

原创 lc87.扰乱字符串(dp)

问题重述使用下面描述的算法可以扰乱字符串 s 得到字符串 t :1.如果字符串的长度为 1 ,算法停止2.如果字符串的长度 > 1 ,执行下述步骤:在一个随机下标处将字符串分割成两个非空的子字符串。即,如果已知字符串 s ,则可以将其分成两个子字符串 x 和 y ,且满足 s = x + y 。随机 决定是要「交换两个子字符串」还是要「保持这两个子字符串的顺序不变」。即,在执行这一步骤之后,s 可能是 s = x + y 或者 s = y + x 。在 x 和 y 这两个子字符串上继续

2021-04-16 23:14:40 109

原创 lc213.打家劫舍2

问题你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,能够偷窃到的最高金额。输入:nums = [2,3,2]输出:3解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。思路

2021-04-15 20:38:46 127

原创 lc208. 实现 Trie (前缀树)

问题重述Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。请你实现 Trie 类:Trie() 初始化前缀树对象。void insert(String word) 向前缀树中插入字符串 word 。boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。boolean starts

2021-04-14 21:20:05 92

原创 lc783.二叉搜索树节点最小距离

问题给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。思路最开始一直在想怎么处理两个值之差绝对值的最小值,由于是任意两个所以单遍历一遍保存结果肯定不行,那么任意两对一共就有Cn2种可能O(n2),一组一组试肯定不行,之前没有看到是bst,所以想的是直接遍历一遍树然后排序,这时候只用比较相邻两个值之间的差值即可,但由于是bst也可以用中序扫一遍就是排序的结果了代码standardclass Solution {private:vector<int>

2021-04-13 21:10:57 75

原创 lc179.最大数

问题给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。1 <= nums.length <= 1000 <= nums[i] <= 109思路先把 nums 中的所有数字转字符串,形成字符串数组 nums_str;比较两个字符串 x,y 拼接的结果 x + y 和 y + x 哪个更大,按此原理设置自定义函数排序,从而确定 x 和 y 谁排在前面;将 nums_str

2021-04-12 20:37:43 178

原创 lc264.丑数 II

from numpy import *def fun(x): x1=x[0] x2=x[1] return 60-10*x1-4*x2+x1*x1+x2*x2-x1*x2#dx1=-10+2*x1-x2,dx2=-4+2*x2-x1#所以雅可比矩阵如下#Jf=grad=[-10+2*x1-x2;-4+2*x2-x1]#同理hessian矩阵如下#[2,-1;-1,2]#通过计算其逆矩阵为#nh=[2/3 1/3;1/3 2/3]#即nh=[[0.6666,0.333

2021-04-12 00:02:39 84

原创 二分查找细节

总结l=mid 区间长度为2死循环r=mid 区间长度为1死循环第一个<=x的数组下标错误示范if(nums[mid]<=x) l=mid;这样会导致区间长度为2时死循环,即mid=l=m,r=m+1且满足nums[m]<=x时原因:因为mid是整数除法下取整的,所以mid始终是<=l的,即有可能等于l,而到最后l,r这个区间本身就是不断朝着满足<=x的方向进行搜索的区间,所以最后的l极有可能满足<=mid,所以最后l一直不变mid始终等于l等于mwh

2021-04-08 23:33:01 121

原创 愤怒的牛(二分答案)

问题重述解题思路代码在这里插入代码片

2021-04-07 23:17:35 650

原创 二分

问题重述81. 搜索旋转排序数组 II已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 ,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,4,4,5,6,6,7] 在下标 5 处经旋转后可能变为 [4,5,6

2021-04-07 21:47:51 77

原创 DP

滚动数组1.如果是左上推右下则为了防止这一层的dp覆盖掉上一层的dp必须逆着遍历eg.f[i][j]=f[i-1][j-len[i]]->dp[j]=dp[j-len[i]] (j:1->n)

2021-04-04 16:10:04 227

原创 九峰与子序列(字符串hash+dp)

问题重述添加链接描述学会字符串哈希后,动态规划选手九峰想要出一道解法为字符串哈希题,于是wcy给他口胡了一道题,却把九峰难倒了,你能帮他解决这个问题吗?给定长度为n的字符串序列a和字符串k,询问a有多少子序列拼接起来等于k。输入样例5 abcbaab c abc ba abcba输出3拼接后等于abcba的子序列有三种:[1,2,4],[3,4],[5]#include <stdio.h>#include <vector>#include <iostre

2021-04-04 14:12:47 105

原创 武辰延的字符串(二分长度+hash)

问题重述添加链接描述众所周知,武辰延很喜欢字符串。这天,他对着两个字符串 s 和 t 发呆,他发现这两个串的前缀有很多相似的地方,s 的两个前缀连接起来竟也是 t 的前缀。武辰延想知道有多少对 s 的非空前缀连接起来是 t 的前缀。形式化地讲,我们把 si看作字符串 s 长度为 i 的前缀。(允许 i=j)而言,当满足 si+sj=ti+j 时,我们认为这两个 s 的前缀拼接后等于 t 的一个前缀。两对 s 的前缀 (si,sj) 与 (si’,sj’) 不同当且仅当 i!=i’或j!=j’​

2021-04-03 23:17:35 109

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除