自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 dp,洛谷p2437 蜜蜂路线

从m到n,都可以转换为从1到n-m+1,f(i) 表示从1到i的走法f(i)=f(i-1)+f(i-2);#include<iostream>#include<cstring>#include<cstdio>using namespace std;struct bign{ int d[3000]; int len; bign(){ memset(d, 0, sizeof(d)); len = 0; } bign operator .

2020-07-26 13:03:43 217

原创 dp,洛谷p1028 数的计算

#include<iostream>using namespace std;long long dp[1005] = { 0 };int main(){ int n; cin >> n; dp[0] = 1; dp[1] = 1; dp[2] = 2; //这是找规律看出来的 for (int i = 3; i <= n; i++){ dp[i] = dp[i - 2] + dp[i / 2]; } cout << dp[n];.

2020-07-26 12:38:53 145

原创 dp,洛谷p1044,栈

思路:状态: dp(i,j)表示进栈了i个,出栈了j个,显然,i>=jdp(i-1,j) 再进一个栈 就是dp(i,j) ,dp(i,j-1)再出一个栈就是dp(i,j)故dp(i,j)=dp(i-1,j)+dp(i,j-1);边界条件:dp(i,0) 进栈i个,出栈0个,情况只有一种#include<iostream>using namespace std;typedef long long ll;/*状态: dp(i,j)表示进栈了i个,出栈了j个,显然,i&.

2020-07-26 12:31:10 162

原创 dp,洛谷p1010

#include<iostream>#include<string>using namespace std;string f(int n){ string str = "", str1; if (n == 0) return "0"; //2的0次方 , if (n == 2) return "2"; //2的2次方 while (n > 0){ //吧n拆解成2的幂次方 int m = 1,k=0; while (m<=n) /.

2020-07-26 12:23:38 100

原创 dp,洛谷p1002过河卒

思路:f(i,j)表示从起点,走到(i,j)的走法f(i,j)可以从f(i-1,j),或者f(i,j-1)走来,马能到的位置不能走f(i,j)=f(i-1,j)+f(i,j-1);边界f(0,0)=1; 为了-1,-2越界,吧0,0移到2,2,小于0的都是0#include<iostream>#include<algorithm>#include<cstdio>using namespace std;struct pos{ int x; int.

2020-07-26 12:13:10 88

原创 dp,洛谷p1255 数楼梯

思路:f(i)代表走到第i阶 有多少种走法f(i)=f(i-1)+f(i-2) 走到第i阶,可以从i-2阶,走来,也可以从i-1阶走来#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;struct bign{ int d[5010]; int len; bign(){ len = 0; mems.

2020-07-26 12:05:57 137

原创 dp,洛谷p1164,小A点菜

思路:f(i,k)表示前i个数字,花完k元的方法的种数f(i,k)=f(i-1,k-a[i])+f(i-1,k) //点第i道菜或者不点第i道菜#include<iostream>#include<cstdio>using namespace std;int dp[110][10000] = {0};int N, M;int a[110];//记忆化递归int f(int i, int k){ //i<0或k<0 if (i < .

2020-07-26 11:58:39 144

原创 95. 不同的二叉搜索树 II,动态规划

不同的二叉搜索树 II给定一个整数 n,生成所有由 1 … n 为节点所组成的 二叉搜索树 。示例:输入:3输出:[[1,null,3,2],[3,2,null,1],[3,1,null,null,2],[2,1,3],[1,null,2,null,3]]解释:以上的输出对应以下 5 种不同结构的二叉搜索树:1 3 3 2 1\ / / / \ 3 2 1 1 .

2020-07-24 18:34:16 113

原创 力扣,第199题 二叉树的右视图,bfs,dfs

二叉树的右视图给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。示例:输入: [1,2,3,null,5,null,4]输出: [1, 3, 4]解释:1 <—/ 2 3 <—\ 5 4 <—思路,bfs就是每层最后一个结点dfs 前序遍历,不过是根右左,每层访问的第一个数,添加进去class Solution {public: vecto.

2020-07-24 12:37:43 116

原创 397.整数替换,记忆化递归,位运算

整数替换给定一个正整数 n,你可以做如下操作:如果 n 是偶数,则用 n / 2替换 n。如果 n 是奇数,则可以用 n + 1或n - 1替换 n。n 变为 1 所需的最小替换次数是多少?示例 1:输入:8输出:3解释:8 -> 4 -> 2 -> 1class Solution {public: unordered_map<int, int> hash; int integerReplacement(int n) { if (n =.

2020-07-22 23:00:53 143

原创 376.摆动序列,动态规划

摆动序列如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3) 是正负交替出现的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一些(也可以.

2020-07-22 18:28:07 115

原创 34. 在排序数组中查找元素的第一个和最后一个位置,二分查找

在排序数组中查找元素的第一个和最后一个位置给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是 O(log n) 级别。如果数组中不存在目标值,返回 [-1, -1]。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: [3,4]示例 2:输入: nums = [5,7,7,8,8,10], target = 6输出: [-1,-1]二分查找统一闭区间的写法:.

2020-07-22 10:58:13 83

原创 力扣第51题,N皇后,BFS+回溯

N皇后n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。上图为 8 皇后问题的一种解法。给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。示例:输入: 4输出: [[".Q…", // 解法 1“…Q”,“Q…”,“…Q.”],["…Q.", // 解法 2“Q…”,“…Q”,“.Q…”]]解释: 4 皇后问.

2020-07-20 23:01:14 291

原创 力扣第52题,N皇后II,dfs+回溯剪枝

N皇后 IIn 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。上图为 8 皇后问题的一种解法。给定一个整数 n,返回 n 皇后不同的解决方案的数量。示例:输入: 4输出: 2解释: 4 皇后问题存在如下两个不同的解法。[[".Q…", // 解法 1“…Q”,“Q…”,“…Q.”],["…Q.", // 解法 2“Q…”,“…Q”,“.Q…”]]题意:N*N的棋盘上,放n个皇后,使每个皇后在不同行,不同列,不在同一条.

2020-07-20 22:58:14 198

原创 力扣第126题单词接龙II,bfs

单词接龙 II给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列。转换需遵循如下规则:每次转换只能改变一个字母。转换后得到的单词必须是字典中的单词。说明:如果不存在这样的转换序列,返回一个空列表。所有单词具有相同的长度。所有单词只由小写字母组成。字典中不存在重复的单词。你可以假设 beginWord 和 endWord 是非空的,且二者不相同。示例 1:输入:beginWord.

2020-07-20 17:54:20 238

原创 力扣127题单词接龙,bfs

单词接龙给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则:每次转换只能改变一个字母。转换过程中的中间单词必须是字典中的单词。说明:如果不存在这样的转换序列,返回 0。所有单词具有相同的长度。所有单词只由小写字母组成。字典中不存在重复的单词。你可以假设 beginWord 和 endWord 是非空的,且二者不相同。示例 1:输入:beginWord = “hit”,en.

2020-07-19 18:20:17 176

原创 力扣第106题,从中序和后序构造二叉树

class Solution {public: TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) { unordered_map<int, int> map; for (int i = 0; i < inorder.size(); i++) { map.insert(make_pair(inorder[i], i)); } //范围是左

2020-07-18 10:32:19 181

原创 力扣第105题,从前序和中序构造二叉树

思路:参数:前序序列,中序序列,和两个序列的范围,表示这个树所有结点根据前序,可以知道开始位置就是根结点,然后再中序里面寻找根结点的位置,记住位置root_pos,根结点左边的都是左子树结点,左子树结点个数left_Num=root_pos - in_start;TreeNode *root= new TreeNode(pre[p_start])递归建立左子树 前序序列的左子树范围就是pre_start+1~pre_start+1+leftNum中序序列的左子树范围就是in_start~root

2020-07-17 23:18:24 155

原创 力扣第98题,验证二叉搜索树,dfs

验证二叉搜索树给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1:输入:2/ 1 3输出: true示例 2:输入:5/ 1 4/ 3 6输出: false解释: 输入为: [5,1,4,null,null,3,6]。根节点的值为 5 ,但是其右子节点值为 4 。思路:两个方法方法1:二叉搜.

2020-07-17 23:00:12 168

原创 棋盘问题,dfs+回溯

点击题目大致题意:在一个矩阵里面,有个不规则的棋盘,#代表可以放旗子, ·代表不能放棋子要求放k个棋子,在不同行不同列,有多少种放法思路:不同行不同列,可以按照行放,每一行在某一个列选出一个棋子,然后标志这一列已经被用了.vis_col[ ]用来标记chess[ ]表示棋盘 为1的地方表示可以放棋子dfs(int r,int num) // r代表在第r行找一列出来,num代表这是放的第num个棋子当 num 等于k ,结果加1for(寻找没有被访问过的某一列){继续递归寻找下一行的

2020-07-17 19:39:39 149

原创 A Knight‘s Journey dfs+回溯

题目大概意思:在一个棋盘中m*n,马从任意位置出发,马是走日的,输入有多组m,n,要求判断是否马可以吧棋盘上每个位置都走到,可以的话打印路径,要求字典序最小,不能就打印impossible.思路:深搜+回溯马是走日的,一共八种组合,要求路径是字典序最小,横坐标是ABCD…纵坐标是12345… 字典序最序最小就得优先y,y从小到大, x就与y对应,也是小的在前int dx[8] = {-1,1,-2,2,-2,2,-1,1};int dy[8] = { -2, -2, -1, -1, 1, 1,

2020-07-17 18:00:20 90

原创 力扣第213题,打家劫舍II,动态规划

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

2020-07-17 12:49:53 167

原创 5.最长回文子串,动态规划

最长回文子串给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: “babad”输出: “bab”注意: “aba” 也是一个有效答案。示例 2:输入: “cbbd”输出: “bb”思路:f(i,j)代表从第i个字符到第j个字符形成的字符串是否是回文串边界:长度为1的字符串f(i,i)=1长度为2的直接比较两个字符串是否相同f(i,j)=f(i+1,j-1)&&s[i]s[j] 下一个串等于 长度减少.

2020-07-17 12:32:07 69

原创 力扣第198,打家劫舍,动态规划

打家劫舍你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 1:输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。示例 2:输入:[2.

2020-07-15 20:29:43 57

原创 力扣第63题不同的路径II,动态规划

不同路径 II一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。说明:m 和 n 的值均不超过 100。示例 1:输入:[[0,0,0],[0,1,0],[0,0,0]]输出: 2解释:3x3 网格的正中间有一个障碍物。从.

2020-07-15 19:52:55 249

原创 力扣第62题,不同路径,动态规划

不同路径一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?例如,上图是一个7 x 3 的网格。有多少可能的路径?示例 1:输入: m = 3, n = 2输出: 3解释:从左上角开始,总共有 3 条路径可以到达右下角。向右 -> 向右 -> 向下向右 -> 向下 -> 向右向下 -> 向右.

2020-07-15 19:46:51 217

原创 动态规划,Zipper

2192:Zipper描述Given three strings, you are to determine whether the third string can be formed by combining the characters in the first two strings. The first two strings can be mixed arbitrarily, but each must stay in its original order.For example, con

2020-07-12 21:05:55 102

原创 动态规划,最佳加法表达式

思路和解析#include <iostream>#include <string>#include <cstring>#include<algorithm>using namespace std;struct bign{ int num[1000]; int len; bign() { memset(num, 0, sizeof(num)); len = 1; } bign(const char *c,int L) {

2020-07-12 20:56:37 167

原创 动态规划,最长公共子序列

1808:公共子序列描述我们称序列Z = < z1, z2, …, zk >是序列X = < x1, x2, …, xm >的子序列当且仅当存在 严格上升 的序列< i1, i2, …, ik >,使得对j = 1, 2, … ,k, 有xij = zj。比如Z = < a, b, f, c > 是X = < a, b, c, f, b, c >的子序列。现在给出两个序列X和Y,你的任务是找到X和Y的最大公共子序列,也就是说要找到一个最长的序

2020-07-12 10:07:26 145

原创 动态规划,最大上升子序列

1759:最长上升子序列描述一个数的序列bi,当b1 < b2 < … < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序列(ai1, ai2, …, aiK),这里1 <= i1 < i2 < … < iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3,

2020-07-11 22:01:06 219

原创 动态规划,数字三角形

思路:dp.1.确定子问题,大问题是从顶点,到底层,走过的路径和最大的子问题,从顶点,往下,往左走,两种走法,归结到从这两个位置到底层的最大路径和,取大的,然后加上这个点的路径2.确定状态, i,j f(i,j) 是第i行第j列的数到底层的最大路径和3.确定边界状态,边界是到了底层,最大路径就是自己4.确定状态方程f(i,j)=max(f(i+1,j),f(i+1,j+1))+D[i][j] i<Nf(i,j) = D[i][j]

2020-07-11 21:49:32 119

原创 分治,排列的逆序数

思路:根据归并算法改编,分治总体大概是,分成两半,左边的逆序数+右边的逆序数+左边的一个数和右边一个数组成的逆序对的数量关键在于如何求左边的一个数,和右边一个数组成的逆序对的数量可以吧左右两边排序从大到小,然后两个指针,i和j开始分别指向左边第一个和右边第一个.然后遍历,如果a[i]>a[j] a[i] 就大于a[j]和之后所有的元素 cnt+= (j之后所有数的个数) 如果 a[i<=a[j]就不是逆序对,j++,继续寻找左右两边排序,正好可以用归并排序,归并前,先算出跨越左右的逆

2020-07-11 15:14:51 130

原创 分治,输出前m大的数

思路:分治的思想,先按照某个值,例如第一个数,开始划分,比a[0]小的放在左边,a[0]大的分在右边,然后根据a[0]的位置,判断a[0]右边包括a[0]一共有多少个数和k比较大小,如果等于k,已经分好了,如果小于k,还需要加a[0]的左边,继续划分出k-(右边的个数),如果大于,说明多了,继续划分k个,从 a[0]的下一个位置开始#include<cstdio>#include<algorithm>using namespace std;void swap(int *a

2020-07-11 14:59:46 99

原创 二分,河中跳房子

10:河中跳房子描述每年奶牛们都要举办各种特殊版本的跳房子比赛,包括在河里从一个岩石跳到另一个岩石。这项激动人心的活动在一条长长的笔直河道中进行,在起点和离起点L远 (1 ≤ L≤ 1,000,000,000) 的终点处均有一个岩石。在起点和终点之间,有N (0 ≤ N ≤ 50,000) 个岩石,每个岩石与起点的距离分别为Di (0 < Di < L)。在比赛过程中,奶牛轮流从起点出发,尝试到达终点,每一步只能从一个岩石跳到另一个岩石。当然,实力不济的奶牛是没有办法完成目标的。农夫

2020-07-09 15:51:03 177

原创 二分,月度开销

009:月度开销总时间限制: 1000ms 内存限制: 65536kB描述农夫约翰是一个精明的会计师。他意识到自己可能没有足够的钱来维持农场的运转了。他计算出并记录下了接下来 N (1 ≤ N ≤ 100,000) 天里每天需要的开销。约翰打算为连续的M (1 ≤ M ≤ N) 个财政周期创建预算案,他把一个财政周期命名为fajo月。每个fajo月包含一天或连续的多天,每天被恰好包含在一个fajo月里。约翰的目标是合理安排每个fajo月包含的天数,使得开销最多的fajo月的开销尽可能少。输入第

2020-07-09 11:06:38 154

原创 分解因数

1751:分解因数标签:递归描述给出一个正整数a,要求分解成若干个正整数的乘积,即a = a1 * a2 * a3 * … * an,并且1 < a1 <= a2 <= a3 <= … <= an,问这样的分解的种数有多少。注意到a = a也是一种分解。输入第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数a (1 < a < 32768)输出n行,每行输出对应一个输入。输出应是一个正整数,指明满足要求的分解的种数样例输入

2020-07-07 16:39:04 376

原创 简单的整数划分

本题思路和代码

2020-07-06 15:06:11 213

原创 力扣第12题整数转罗马数字

package _12整数转罗马数字;import javax.jws.soap.SOAPBinding;public class Solution { public static void main(String[] args) { System.out.println(new Solution().intToRoman(2782)); } public String intToRoman(int num) { //存放位置

2020-07-06 13:51:09 137

原创 Pop Sequence

Given a stack which can keep M numbers at most. Push N numbers in the order of 1, 2, 3, …, N and pop randomly. You are supposed to tell if a given sequence of numbers is a possible pop sequence of the stack. For example, if M is 5 and N is 7, we can obtain

2020-07-02 22:20:47 376

原创 链表每k个翻转一次

Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K = 3, then you must output 3→2→1→6→5→4; if K = 4, you must output 4→3→2→1→5→6.Input Specification:E

2020-07-02 21:26:14 193

空空如也

空空如也

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

TA关注的人

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