算法
文章平均质量分 65
算法学习以及leetcode刷题
zhaoxiaoba
哈哈哈
展开
-
背包问题模板总结
文章目录三种背包比较状态转移方程分类解题模板例题分割等和子集零钱兑换279完全平方数目标和377 组合总和518. 零钱兑换 II1115 掷骰子的方法474 一和零1048 最后一块石头重量三种背包比较01背包N件物品,每件物品有价值V和消耗的容量C, 背包的容量有限,一个物品只能取一次,什么情况下价值最大?完全背包N件物品,每件物品有价值V和消耗的容量C, 背包容量有限,一个物品可以无限取多次,什么情况下价值最大?多重背包N件物品,每件物品有价值V和消耗的容量C, 背包容量有限,一个物品原创 2021-06-01 09:32:19 · 311 阅读 · 0 评论 -
石子游戏-系列DP
文章目录486. 预测赢家方法一 直观迭代方法二 记忆化方法三 动态规划石子游戏石子游戏 VII石子游戏 III486. 预测赢家题目????给定一个表示分数的非负整数数组。 玩家 1 从数组任意一端拿取一个分数,随后玩家 2 继续从剩余数组任意一端拿取分数,然后玩家 1 拿,…… 。每次一个玩家只能拿取一个分数,分数被拿取之后不再可取。直到没有剩余分数可取时游戏结束。最终获得分数总和最多的玩家获胜。给定一个表示分数的数组,预测玩家1是否会成为赢家。你可以假设每个玩家的玩法都会使他的分数最大化。原创 2021-04-21 14:52:09 · 303 阅读 · 0 评论 -
LIS递增子序列o(nlogn)时间复杂度-马戏团人塔
有个马戏团正在设计叠罗汉的表演节目,一个人要站在另一人的肩膀上。出于实际和美观的考虑,在上面的人要比下面的人矮一点且轻一点。已知马戏团每个人的身高和体重,请编写代码计算叠罗汉最多能叠几个人。思路:首先按照身高从低到高排序,然后找到对应体重的最长递增子序列。注意身高和体重需要严格递增,不可以相等。解法一: o(n^2)class Solution { struct people{ int height; int weight; bool op原创 2021-03-31 11:22:37 · 166 阅读 · 0 评论 -
高楼扔鸡蛋问题-经典动态规划
文章目录1. 高楼扔鸡蛋2. 猜数字大小1. 高楼扔鸡蛋给你 k 枚相同的鸡蛋,并可以使用一栋从第 1 层到第 n 层共有 n 层楼的建筑。已知存在楼层 f ,满足 0 <= f <= n ,任何从 高于 f 的楼层落下的鸡蛋都会碎,从 f 楼层或比它低的楼层落下的鸡蛋都不会破。每次操作,你可以取一枚没有碎的鸡蛋并把它从任一楼层 x 扔下(满足 1 <= x <= n)。如果鸡蛋碎了,你就不能再次使用它。如果某枚鸡蛋扔下后没有摔碎,则可以在之后的操作中 重复使用 这枚鸡蛋。原创 2021-03-26 22:16:38 · 2699 阅读 · 0 评论 -
二叉树的最大路径和
A path in a binary tree is a sequence of nodes where each pair of adjacent nodes in the sequence has an edge connecting them. A node can only appear in the sequence at most once. Note that the path does not need to pass through the root.The path sum of a原创 2021-03-01 16:32:36 · 166 阅读 · 0 评论 -
判断二分图
题目There is an undirected graph with n nodes, where each node is numbered between 0 and n - 1. You are given a 2D array graph, where graph[u] is an array of nodes that node u is adjacent to. More formally, for each v in graph[u], there is an undirected edg原创 2021-02-27 20:49:21 · 126 阅读 · 0 评论 -
美团笔试-回转寿司
小美请小团吃回转寿司。转盘上有N盘寿司围成一圈,第1盘与第2盘相邻,第2盘与第3盘相邻,…,第N-1盘与第N盘相邻,第N盘与第1盘相邻。小团认为第i盘寿司的美味值为A[i](可能是负值,如果小团讨厌这盘寿司)。现在,小团要在转盘上选出连续的若干盘寿司,使得这些寿司的美味值之和最大(允许不选任何寿司,此时美味值总和为0)。输入:第一行输入一个整数T(1<=T<=10),表示数据组数。每组数据占两行,第一行输入一个整数N(1<=N<=10^5);第二行输入N个由空格隔开的整数,原创 2021-02-24 23:22:51 · 1382 阅读 · 0 评论 -
C++ priority_queue的自定义比较方式
经常需要用优先队列来进行一些算法的优化,于是今天对优先队列的排序方式做一个小结:首先,先手写一个小根堆,再分析代码#include<queue>#include<vector>#include<iostream>using namespace std; struct node{ int x, y; node(int x,int y):x(x),y(y){}}; struct cmp{ bool operator()(node转载 2021-02-24 16:39:26 · 1139 阅读 · 0 评论 -
求组合数
想法:以前做比赛的时候遇到很多需要计算组合数的情况,都是当时手敲的,写递归不是暴就是超时啥的,或者是因为要取模,然后还要求逆元,所以敲得不是慢就是老是出问题,所以现在搞出模板来以后用就快了。 一:线性求C(n,m) 解释:由HDU 4927这道题求的组合数,可以了解到组合数的一些递推快速求法,因为这道题就是卡组合数的时间的。如果我们要算C(10,4),我们可以先算C(10,1),再算C(10,2),再算C(10...转载 2021-02-23 10:45:10 · 212 阅读 · 0 评论 -
买卖股票问题汇总
文章目录1. 买卖股票最佳时机2. 买卖股票的最佳时机 II3. 买卖股票的最佳时机 III买卖股票的最佳时机 IV1. 买卖股票最佳时机给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意:你不能在买入股票前卖出股票。输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1原创 2020-12-28 16:54:56 · 181 阅读 · 0 评论 -
第k大数字-快排,大根堆实现
快排思路实现有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。class Finder {public: int findKth(vector<int> a, int n, int K) { // write code here return findK(a, 0, n-1, K); } int partition(vec原创 2020-12-10 15:50:17 · 208 阅读 · 0 评论 -
链表插入排序,选择排序,归并排序实现c++
目录插入排序选择排序归并排序插入排序leetcode 147/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* insertionSortList(ListNod原创 2020-12-10 11:12:41 · 200 阅读 · 0 评论 -
约瑟夫环
约瑟夫问题 约瑟夫问题是个著名的问题:N个人围成一圈,第一个人从1开始报数,报M的将被杀掉,下一个人接着从1开始报。如此反复,最后剩下一个,求最后的胜利者。 例如只有三个人,把他们叫做A、B、C,他们围成一圈,从A开始报数,假设报2的人被杀掉。 首先A开始报数,他报1。侥幸逃过一劫。然后轮到B报数,他报2。非常惨,他被杀了C接着从1开始报数接着轮到A报数,他报2。也被杀死了。最终胜利者是C 解决方案 普通解法 刚学数据结构的时候,我们可能用链表的方法去模拟这个过程,N个人看作是N个链表节点,...转载 2020-11-18 16:54:39 · 355 阅读 · 0 评论 -
前缀数组后缀数组
连续两天的周赛,双周赛都用到了,记录一下。1653. 使字符串平衡的最少删除次数给你一个字符串 s ,它仅包含字符 ‘a’ 和 'b’ 。你可以删除 s 中任意数目的字符,使得 s 平衡 。我们称 s 平衡的 当不存在下标对 (i,j) 满足 i < j 且 s[i] = ‘b’ 同时 s[j]= ‘a’ 。请你返回使 s 平衡 的 最少 删除次数。输入:s = "aababbab"输出:2解释:你可以选择以下任意一种方案:下标从 0 开始,删除第 2 和第 6 个字符("aa原创 2020-11-16 11:12:30 · 978 阅读 · 0 评论 -
根据身高建队列
假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。注意:总人数少于1100人。输入:[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]输出:[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]] /** * 解题思路:先排序再插入 * 1.排序规则:按照先H高度降序,K个数升序排序原创 2020-11-16 09:54:20 · 595 阅读 · 1 评论 -
回文字串---DP----Manacher(马拉车)
以下题为例:5. 最长回文子串给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。输入: "babad"输出: "bab"注意: "aba" 也是一个有效答案。一、DP,O(n^2)dp[i][j]表示i到j是否为回文字符串class Solution {public: string longestPalindrome(string s) { int len = s.size(); if(s.size() ==原创 2020-11-13 11:55:21 · 122 阅读 · 0 评论 -
pair<int,int>排序++优先队列重载排序
最接近原点的 K 个点题目链接我们有一个由平面上的点组成的列表 points。需要从中找出 K 个距离原点 (0, 0) 最近的点。(这里,平面上两点之间的距离是欧几里德距离。)你可以按任何顺序返回答案。除了点坐标的顺序之外,答案确保是唯一的。示例:输入:points = [[1,3],[-2,2]], K = 1输出:[[-2,2]]解释: (1, 3) 和原点之间的距离为 sqrt(10),(-2, 2) 和原点之间的距离为 sqrt(8),由于 sqrt(8) < s.原创 2020-11-09 10:32:59 · 2777 阅读 · 1 评论 -
前缀树C++
文章目录前缀树代码前缀树特点就是利用空间换时间,通过利用前缀存储的方法达到高效的查找效率。3个基本性质:根节点不包含字符,除根节点外每一个节点都只包含一个字符。从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。每个节点的所有子节点包含的字符都不相同假设有abc,abd,bcd,efg,hii,那么我们构建如下一个树结构用于表示这些单词这样带来的问题就是如果匹配b,这个单词是否出现过呢,bc出现过吗? 针对上述问题,为每个节点添加字符串的统计信息,表示以这个节点对原创 2020-10-30 15:30:52 · 207 阅读 · 0 评论 -
旋转排列数组题-二分
参考【leetcode题解】文章目录33. 搜索旋转排序数组(不重复,查找特别值)81. 搜索旋转排序数组 II(重复,查找特定值)153. 寻找旋转排序数组中的最小值(不重复,寻找最小值)154. 寻找旋转排序数组中的最小值 II(重复,寻找最小值)33. 搜索旋转排序数组(不重复,查找特别值)给你一个升序排列的整数数组 nums ,和一个整数 target 。假设按照升序排序的数组在预先未知的某个点上进行了旋转。(例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2原创 2020-10-16 15:05:13 · 121 阅读 · 0 评论 -
二分查找(二)
之前转载过一篇作者写的二分,分别阐述了三种情况,寻找值,寻找左边界,寻找右边界,最近看了labuladong的文章,新的边界套路理解,总结。原来的文章:二分原来这篇更容易理解,新文章套路更统一整齐。寻找一个数int binarySearch(int[] nums, int target){ int left = 0, right = nums.size()-1; while(left<=right){ int mid = left + (right - left)/2; if(nu原创 2020-10-15 10:11:24 · 71 阅读 · 0 评论 -
刷题笔记-小技巧
sort(nums.begin(),nums.end(),greater<int>());//从大到小排序 sort(nums.begin(),nums.end(),less<int>()) 从小到大排序原创 2020-11-04 15:01:42 · 150 阅读 · 0 评论 -
素数筛选法
当获取一个素数时,将他所有的倍数标记为非素数,当遍历到一个数字没有被标记,说明没有比他小的素数因数,确定为素数。例子:从2开始遍历2到10000的所有整数,找到所有素数int prime_size = 0;int prime[10000];int mark[10001];void init(){ for(int i = 2; i <= 10000; i++){ if(mark[i])continue; prime[prime_size++] = i; for(int j =原创 2020-10-13 21:05:06 · 115 阅读 · 0 评论 -
单调栈
文章目录739. 每日温度496. 下一个更大元素 I503. 下一个更大元素 II42 接雨水84. 柱状图中最大的矩形单调栈就是栈里面存放的数据都是有序的,所以可以分为单调递增栈和单调递减栈两种。单调递增栈就是从栈底到栈顶是从大到小单调递减栈就是从栈底到栈顶是从小到大单调栈主要回答这样的几种问题比当前元素更大的下一个元素比当前元素更大的前一个元素比当前元素更小的下一个元素比当前元素更小的前一个元素看题目,根据代码手工画一下运行过程就可以明白了:举个例子,Next Greater原创 2020-10-13 09:53:48 · 115 阅读 · 0 评论 -
荷兰三色旗
leetcode 75 颜色分类给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色示例输入: [2,0,2,1,1,0]输出: [0,0,1,1,2,2]class Solution {public: void sortColors(vector<int>& nums) { // 荷兰三色旗原创 2020-10-07 09:39:31 · 284 阅读 · 0 评论 -
kmp字符串匹配算法
prefix_table next 数组GTGTGCF为例子,他的前缀表,前后缀相等的最大长度,不包含本身。--------------------- -1G----------------------0GT---------------------0GTG--------------------1GTGT-------------------2GTGTG------------------3GTGTGC-----------------0GTGTGCF-----------------0原创 2020-09-29 11:12:07 · 74 阅读 · 0 评论 -
字符串模式匹配(BF--RK--BM--KMP)
目录BFRKBM坏字符规则好后缀规则KMPnextBFBrute Force,暴力破解,时间复杂度最大为O(mn)bool patternMatching(string pattern, string value) { int m = pattern.size(); int n = value.size(); for(int i = 0; i <= (n-m); i++){ int begin = i;原创 2020-09-28 20:33:10 · 148 阅读 · 0 评论 -
二叉树遍历-递归迭代整理
前序遍历: 节点-左子树-右子树(中-左-右)中序遍历: 左子树-节点-右子树(左-中-右)后续遍历: 左子树-右子树-节点(左-右-中)数据结构 Definition for a binary tree node. struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0), left(nullptr), right(nullptr) {}.原创 2020-09-24 11:28:15 · 106 阅读 · 0 评论 -
红黑树-笔记
目录二叉查找树红黑树一. 定义和特性三. 变色和旋转BST删除红黑树删除AVL树二叉查找树二叉查找树(binary search tree)BST具备的特性:1. 左子树所有的节点都小于或者等于它根节点的值2. 右子树所有的节点都大于或等于它跟节点的值3. 左右子树分别为二叉查找树好处就是查找方便,类似二分查找,查找的最大次数就等于树的最大高度。在插入新的节点时,利用二分的 思想,一层层比较大小,找到新节点合适的插入位置,但是缺陷是插入的时候可能另二叉树严重失衡,如下:假设初始的二叉查找树只转载 2020-09-22 15:22:56 · 122 阅读 · 0 评论 -
C++基础-string截取、替换、查找子串函数
1. 截取子串 s.substr(pos, n) 截取s中从pos开始(包括0)的n个字符的子串,并返回 s.substr(pos) 截取s中从从pos开始(包括0)到末尾的所有字符的子串,并返回2. 替换子串 s.replace(pos, n, s1) &nb.转载 2020-09-18 16:56:29 · 640 阅读 · 0 评论 -
vector去重
记录一下:sort(res.begin(), res.end());res.erase(unique(res.begin(), res.end()),res.end());原创 2020-09-18 09:33:09 · 84 阅读 · 0 评论 -
二分查找,查指定值、小于或等于k的最大值,大于或等于k的最大值
(图文)二分查找,查指定值、小于或等于k的最大值,大于或等于k的最大值 </h1> <div class="clear"></div> <div class="postBody"> 我们经常会用到二分查找二分查找应该很多人都会写了,今天要写一个用二分查找找到小于k的最大值的时候看了很久不懂他设计的思路,后来想通了,记录一下。所以这篇主要是...转载 2020-07-28 15:26:35 · 5744 阅读 · 0 评论 -
快速乘-俄罗斯农民乘法
俄罗斯农民乘法:https://blog.csdn.net/iteye_4501/article/details/81682160快速乘:LL mul(LL a,LL b){ LL ret=0; for(;b;b>>=1){ if(b&1) ret=(ret+a)%MOD; a=a*2%MOD; } return ret;}inline ll ksc(ll x,ll y,ll p){//计算x乘y的积 ll原创 2020-06-02 10:38:42 · 463 阅读 · 0 评论 -
动态规划-字符串
题目列表32. 最长有效括号10. 正则表达式匹配32. 最长有效括号题目链接代码class Solution {public: int longestValidParentheses(string s) { if(s == "") return 0; vector<int> dp(s.size(),0); for(int i = 1; i < s.size(); i++){ if(s[i] == '原创 2020-05-30 15:47:34 · 215 阅读 · 0 评论 -
遍历决策树- 回溯算法
参考:https://leetcode-cn.com/problems/permutations/solution/hui-su-suan-fa-xiang-jie-by-labuladong-2/原创 2020-05-29 20:29:33 · 736 阅读 · 0 评论 -
回溯算法
题目列表引例一 (全排列)引例二(电话号码字母组合)39.组合总和40. 组合总和 II78 子集90. 子集 II引例一 (全排列)全排列示例输入: [1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]代码class Solution {public: vector<vector<int>> permute(vector<int>&原创 2020-05-29 17:55:12 · 150 阅读 · 0 评论 -
二分法-旋转排序数组
题目原题链接假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。你可以假设数组中不存在重复元素。示例输入: [3,4,5,1,2]输出: 1代码class Solution {public: int findMin(vector<int>& nums) { int left = 0, right = nums.size()-原创 2020-05-29 11:44:19 · 194 阅读 · 0 评论 -
滑动窗口C++
题目列表3. 无重复字符的最长子串72. 最小覆盖子串567. 字符串的排列438. 找到字符串中所有字母异位词3. 无重复字符的最长子串原题链接示例输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。思路设立左指针left和右指针right右指针向右移动判断右指针对应的字符在窗口内是否出现过如果出现过,左指针移动到右指针对应相同字符的下一个。更新子串长度。循环移动右指针 本质上,就是遍历每一个s[righ原创 2020-05-28 17:58:30 · 2267 阅读 · 0 评论 -
面试题37. 序列化二叉树
观察题目示例,序列化的字符串实际上是二叉树的 “层序遍历”(BFS)结果,本文也采用层序遍历。通常使用的前序、中序、后序、层序遍历记录二叉树的信息不完整,即可能对应着多种二叉树结果。题目要求的 “序列化” 和 “反序列化” 是 可逆 操作。因此,序列化的字符串应携带 “完整的” 二叉树信息,即拥有单独表示二叉树的能力。为使反序列化可行,考虑将越过叶节点后的 null 也看作是节点。在此基础上,对于列表中任意某节点 node ,其左子节点 node.left 和右子节点 node.right 在序列转载 2020-05-26 17:03:31 · 113 阅读 · 0 评论 -
两数之和-三数之和-四数之和cpp
题目列表1. 两数之和15. 三数之和18. 四数之和445. 两数相加 II454. 四数相加 II1. 两数之和给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。class Solution {public: vector<int> twoSum(vector<int>& nums, int target) {原创 2020-05-22 22:20:06 · 357 阅读 · 0 评论 -
打家劫舍练习题
题目列表198. 打家劫舍213.打家劫舍II337. 打家劫舍 III740. 删除与获得198. 打家劫舍题目你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。示例输入: [1,2,3,1]输出: 4解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3原创 2020-05-22 17:21:10 · 221 阅读 · 0 评论