算法
文章平均质量分 88
记录力扣、面试中的算法题
wjyGrit
每当你被漫天乌云压得喘不过气时,往往是一切问题解决的时候。而当你感觉晴空万里时,其实并没有你想得那么好
展开
-
二分法和双指针
这篇文章里的代码主要用js和java实现,这篇文章主要记录双指针和二分法的一些比较奇特,经典的题,同时也会把做题中的一些技巧以及一些不常见但很有效的用法记录下来# 二分法## 概述> 常用术语> * 目标 Target -- 目标值> * 索引Index -- 查找的当前位置> * 左、右指示符 Left,Right —— 我们用来维持查找空间的指标> * 中间指示符 Mid —— 我们用来应用条件来确定我们应该向左查找还是向右查找的索引二分查找维护查找空间的左、右和中间指原创 2021-10-12 19:38:56 · 325 阅读 · 0 评论 -
岛屿数量——搜索复习
dfs解法class Solution {private: void dfs(vector<vector<char>>& grid, int r, int c) { int nr = grid.size(); int nc = grid[0].size(); grid[r][c] = '0'; if (r - 1 >= 0 && grid[r-1][c] == '1') df.原创 2020-08-17 19:35:41 · 110 阅读 · 0 评论 -
N叉树的最大深度
class Solution {public: int maxDepth(Node* root) { if (root == nullptr)return 0; int depth = 0; queue<Node*>q; q.push(root); while (!q.empty()) { int size = q.size(); for (int i = .原创 2020-08-11 20:10:08 · 185 阅读 · 0 评论 -
力扣——对称二叉树
对称二叉树题目方法一:递归方法二:迭代题目方法一:递归思路:我们可以实现这样一个递归函数,通过「同步移动」两个指针的方法来遍历这棵树,pp 指针和 qq 指针一开始都指向这棵树的根,随后 pp 右移时,qq 左移,pp 左移时,qq 右移。每次检查当前 pp 和 qq 节点的值是否相等,如果相等再判断左右子树是否对称。class Solution {public: bool check(TreeNode *p, TreeNode *q) { if (!p &&am原创 2020-08-02 09:27:16 · 147 阅读 · 0 评论 -
力扣——4的幂
先判断是不是只有一位是1,然后看模3的结果。如果模3为1,则true,如果模3为2则false;class Solution {public: bool isPowerOfFour(int num) { if(num < 0) return false; int t = num & (-num); if(num - t != 0) return false; return num % 3 == 1; }};原创 2020-07-29 19:47:40 · 157 阅读 · 0 评论 -
力扣——区域和检索(数组不可变)
这题比较简单,其中numarray的函数时把传进来的Nums转换为类内部的数组,在用sumrange计算i-j的前缀和。这里一种是利用dp,直接计算并存储nums数组的前缀和,调用intrange时直接计算即可另一种就是暴力解法了。两者运行时间差别如下//此方法是用前缀和//_sum数组存储nums的前缀和class NumArray {private: vector<int> _sum;public: NumArray(vector<int>&am原创 2020-07-24 09:01:19 · 104 阅读 · 0 评论 -
力扣——多数元素
这题我就只写哈希表的方法,其他解题方法可看这里class Solution {public: int majorityElement(vector<int>& nums) { unordered_map<int, int>counts; int majority = 0, cnt = 0; for (int num : nums) { ++counts[num]; if (counts[num] > cnt) { majority原创 2020-07-20 13:55:53 · 142 阅读 · 0 评论 -
力扣——验证回文字符串
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。说明:本题中,我们将空字符串定义为有效的回文串。示例 1:输入: "A man, a plan, a canal: Panama"输出: true示例 2:输入: "race a car"输出: false来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/valid-palindrome著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注原创 2020-07-18 10:50:57 · 311 阅读 · 0 评论 -
多重背包——庆功会
题目链接#include<iostream>#include<vector>#include<algorithm>using namespace std;int n, m;int v[505], w[505], s[505], f[6005];int main() { cin >> n >> m; for (int i = 1; i <= n; i++) { cin >> v[i] >> w[i]原创 2020-07-15 15:56:34 · 153 阅读 · 0 评论 -
分组背包
//首先判断一个分组当中的一件物品,同样有取和不取两种状态//这样就可以转换为0-1背包问题,其伪代码如下://for 所有的组k// for v = V..0// for 所有的i属于组k// f[v] = max{ f[v],f[v - c[i]] + w[i] }#include<bits\stdc++.h>using namespace std;int dp[205];int we[35], c[35];//重量,价值vector<int>ve[原创 2020-07-15 14:40:36 · 115 阅读 · 0 评论 -
动态规划经典题——石子合并
石子合并题目信息路边玩法操场玩法问题分析路边玩法操场玩法算法设计路边玩法操场玩法完美图解(以路边玩法为例)伪代码详解路边玩法操场玩法实战演练优化后代码1274:【例9.18】合并石子题目信息路边玩法有n堆石子放在路边一列,现在要将石子有序地合并成一堆,规定每次只能移动相邻的两堆石子合并,合并花费为新合成的一堆石子的数量。求将这N堆石子合并成一堆的总花费(最小或最大)操场玩法一个圆形操场周围摆放着n堆石子圆圈,现在要将石子有序地合并成一堆,规定每次只能移动相邻的两堆石子合并,合并花费为新合成的一堆石原创 2020-07-12 02:35:33 · 3058 阅读 · 2 评论 -
完全背包问题——最好理解
完全背包问题题目描述解法归纳普通做法(照着公式来)优化后的做法相关题解题目描述【题目描述】设有n种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于M,而价值的和为最大。【输入】第一行:两个整数,M(背包容量,M≤200)和N(物品数量,N≤30);第2…N+1行:每行二个整数Wi,Ci,表示每个物品的重量和价值。【输出】仅一行,一个数,表示最大总价值。【输入样例】10原创 2020-07-11 14:40:50 · 216 阅读 · 0 评论 -
0-1背包问题详解
0-1背包问题题目基本思路例题相关题解题目有N件物品和一个容量为V的背包。放入第i件物品耗费的费用是Ci1,得到的价值是Wi。求解将哪些物品装入背包可使价值总和最大。基本思路这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或者不放用子问题定义状态: 即F[ i ,v ]表示前 i 件物品恰放入一个容量为v的背包可以获得最大价值,则其状态转移方程为:F[ i , v ] = max {F [ i-1, v] , F[ i-1, v- Ci] + Wi }解释我们若只考虑第 i 件原创 2020-07-11 14:14:52 · 156 阅读 · 0 评论 -
动态规划系列题型讲解
动态规划系列题型最长公共子序列完全背包问题本篇文章持续更新中最长公共子序列最长公共子序列讲解完全背包问题原创 2020-07-11 13:01:05 · 207 阅读 · 0 评论 -
动态规划详解之——最长的公共子序列
最长公共子序列问题分析分析最优解的结构特征建立最优值的递归式底向上计算最优值,并记录最优值和最优策略构造最优解算法设计完美图解伪代码详解完整代码相关题解问题分析给定两个序列X={x1,x2,…,xm} 和 Y={y1,y2,…,yn},找出X和Y的一个最长的公共子序列。这里的讲解是参照趣学算法一书,此书的地址在Dijkstra的文章末。分析最优解的结构特征假设已经知道 Zk={z1,z2,…,zk} 是X={x1,x2,…,xm} 和 Y={y1,y2,…,yn的最长公共子序列。那么可以分3中情况原创 2020-07-10 16:42:26 · 8623 阅读 · 2 评论 -
T1342 最短路径问题
题目链接思路这题跟模板题一样的,只是图的权值要自己去算。代码如下:对Floyd不懂的可以看以下这篇文章#include<iostream>#include<iomanip> #include<algorithm>#define N 10001#define INF 0x3f3f3f3fusing namespace std;int x[N], y[N]; //用来存储每个点的x,y坐标double g[N][N]; //用来记录点之间的原创 2020-07-10 13:11:47 · 237 阅读 · 0 评论 -
Djikstra算法训练——题一:最小花费
这是继Dijkstra算法讲解后的第一篇练习题,题目为最小花费,我先上代码,这题跟我们的讲解里的模板题有点类似,但也有很大的不同,可以归为两种题型。代码里我就不注释了。题目:【题目描述】在n个人中,某些人的银行账号之间可以互相转账。这些人之间转账的手续费各不相同。给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少钱使得转账后B收到100元。【输入】第一行输入两个正整数n,m,分别表示总人数和可以互相转账的人的对数。以下m行每行输入三个正整数x,y,z,表示标原创 2020-07-08 22:19:38 · 3288 阅读 · 1 评论 -
二进制求和
给你两个二进制字符串,返回它们的和(用二进制表示)。输入为 非空 字符串且只包含数字 1 和 0。 示例 1:输入: a = "11", b = "1"输出: "100"示例 2:输入: a = "1010", b = "1011"输出: "10101" 提示: 每个字符串仅由字符 '0' 或 '1' 组成。 1 <= a.length, b.length <= 10^4 字符串如果不是 "0" ,就都不含前导零。来源:力扣(Le原创 2020-07-08 20:14:34 · 323 阅读 · 0 评论 -
只有5行的算法——Floyd算法
Floyd算法Floyd 的特别之处算法设计完整代码之前写了一篇Dijkstra算法详解,那是在趣学算法上的,不过却没在其中找到Floyd,现在这篇文章是啊哈算法里的Floyd算法讲解,同样,书的分享链接在文章末。Floyd 的特别之处暑假,小哼准备去一些城市旅游。有些城市有公路,有些城市之间没有,如下图。为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之间的最短路程。 上图中有4个城市,8条公路,公路上的数字表示这条公路的长度。我们现在需要求任意两个城市之间的最短路程,也就是求任原创 2020-07-08 19:48:01 · 265 阅读 · 0 评论 -
Dijkstra算法详解(完美图解、趣学算法)
Dijkstra算法详解Dijkstra算法设计Dijkstra算法简介Dijkstra算法的基本思想Dijkstra贪心策略完美图解伪代码详解完整代码算法解析及优化拓展使用优先队列的完整代码相关题的题解写在最后的话Dijkstra算法设计Dijkstra算法简介Dijkstra算法是解决**单源最短路径**问题的**贪心算法**它先求出长度最短的一条路径,再参照该最短路径求出长度次短的一条路径 直到求出从源点到其他各个顶点的最短路径。Dijkstra算法的基本思想首先假定源点为u,顶点集合原创 2020-07-07 13:36:12 · 122517 阅读 · 28 评论 -
剪花布条——KMP算法
emmmmm,KMP算法我还不是很懂,[可以看下这篇博客](https://blog.csdn.net/v_JULY_v/article/details/7041827)这题也就是套用了KMP的模板,然后在其中增加了计数的语句,代码如下#include<bits/stdc++.h>char s[1000000 + 10], t[10000 + 10];int ne[10000 + 10];int n, m;using namespace std;void get_next(){原创 2020-07-06 12:54:22 · 263 阅读 · 0 评论 -
力扣——有效的括号
解题思路当开始接触题目时,我们会不禁想到如果计算出左括号的数量,和右括号的数量,如果每种括号左右数量相同,会不会就是有效的括号了呢?事实上不是的,假如输入是 [{]},每种括号的左右数量分别相等,但不是有效的括号。这是因为结果还与括号的位置有关。仔细分析我们发现,对于有效的括号,它的部分子表达式仍然是有效的括号,比如 {()[()]} 是一个有效的括号,()[{}] 是有效的括号,[()] 也是有效的括号。并且当我们每次删除一个最小的括号对时,我们会逐渐将括号删除完。比如下面的例子。这个思考转载 2020-07-03 16:22:19 · 229 阅读 · 0 评论 -
楼间跳跃----贪心复习
【题目描述】在一条街道上有n栋楼,第i栋有hi层,每层都有价值为vi的物品。Lyra可以花费一单位时间在同一栋楼中向上或向下走一层。特别地,每栋楼里都有一个大滑梯,只能从顶楼通往一楼,所以如果Lyra在顶层,可以花费一单位时间通过滑梯到达一楼(注意只有在顶楼才可以使用滑梯)。Lyra还可以在不同的楼之间跳跃,即花费一单位时间从当前楼移动到相邻楼的同层,如果相邻楼没有Lyra当前位置高,则会落到相邻楼的顶层。初始时Lyra在第一栋楼的顶层,她有m单位时间可以移动,Lyra拿去物品不需要时间,且一个物品被原创 2020-07-01 16:20:06 · 665 阅读 · 1 评论 -
2019蓝桥省赛题解
219初赛年号字串数列求值数的分解迷宫完全二叉树的权值等差数列年号字串【问题描述】小明用字母 A 对应数字 1,B 对应 2,以此类推,用 Z 对应 26。对于 27以上的数字,小明用两位或更长位的字符串来对应,例如 AA 对应 27,AB 对应 28,AZ 对应 52,LQ 对应 329。请问 2019 对应的字符串是什么?【解题思路】2019 % 26 = 77 余 17 ,17 对应 Q77 % 26 = 2 余 25,25 对应 Y2 % 26 = 0 余 2, 2 对应 B若原创 2020-09-13 13:55:32 · 200 阅读 · 0 评论