
算法
菜比
这个作者很懒,什么都没留下…
展开
-
PAT1005 Spell It Right
此题重点为用string接输入,int会溢出#include <iostream>#include <string>#include <string.h>#include <vector>using namespace std;string transfer(int i){ if(i == 0) return "zero"; if(i == 1) return "one"; if(i == 2) return "two"原创 2020-06-15 11:39:00 · 160 阅读 · 0 评论 -
PAT1003 Emergency 迪杰斯特拉 + dp
坑:第二个测试用例起始点为终止点,此时的路径数为1疑惑:用深度优先算法超出内存限制了,希望用深度优先通过的大佬不吝赐教收获:迪杰斯特拉需要的数据结构比较简单: //距离矩阵,查值需要 vector<vector<int> > length; //记录哪些节点已经找到路径(0没找到,1找到),用来将节点划分成两个集合 int alreadyReach[size()]; //到i节点的最短距离,记录中间结果,用于下一步计算 int minLen[size原创 2020-06-12 15:18:45 · 155 阅读 · 0 评论 -
PAT1001 A+B Format
题目要求是每三个数之间加一个“,”类似外国的那种数的表示方法。第一次做PAT,用了2小时,,#include <iostream>#include <vector>#include <cstdio>#include <math.h>using namespace std;//计算数字有多少位,//一定不要再用 (int)(log(sum)/log(10))这样的了,效率虽高,但出错概率极大int CalBit(int num){ i原创 2020-06-11 11:35:19 · 137 阅读 · 0 评论 -
lc139. 单词拆分
原题链接注意:本文的回溯代码会出现超时异常,仅供理解题目和拓展思路使用class Solution {//25min 回溯public: map<char, vector<string>> Dict; int end ;public: bool canMatch(string word, char arr[], int pos){ int len = word.size(); char wordArr[原创 2020-06-07 10:31:30 · 199 阅读 · 0 评论 -
lc115. 不同的子序列
原题链接注释部分是我对dp方法中找递推公式的一点拙见class Solution {// 用时34min// 在找递推公式时,详细讨论具体一位的手动推断情况是很有效的// 1.确定子问题是什么?// 2.确定在讨论某一位的时候,已经有哪些子问题的解是已知的// 3.确定当前这一位的解如何完全根据子问题的解表示// 题目本质上和不同路径数是一样的,一个是最后一位匹配选与不选,一个是前一步向上与向左public:原创 2020-06-04 13:56:36 · 188 阅读 · 0 评论 -
lc97. 交错字符串_dp
原题链接被注释掉的部分是分治法的完整代码。dp数据结构:Arr[i][j][k]代表s3的前 i 位是否是s1的前 j 位和s2的前 k 位的交错字符串。dp递推公式:Arr[i][j][k] = (s3的第 i 位可以匹配s1的第 j 位 && Arr[i - 1][j - 1][k])|| (s3的第 i 位可以匹配s2的第 k 位 && Arr[i - 1][j][k - 1])class Solution {// public:// int s原创 2020-06-03 10:41:24 · 362 阅读 · 0 评论 -
lc91. 解码方法_dp
原题链接递推公式:when charAt[i] == ‘0’ :if(charAt[i - 1] == 1 || charAt[i - 1] == 2) dp[i] = dp[i - 2];else return 0;when charAt[i] != ‘0’if(charAt[i] 和 charAt[i - 1] 可以组合) dp[i] = dp[i - 1] + dp[i - 2]else dp[i] = dp[i - 1]class Solution {public:原创 2020-06-02 14:02:53 · 322 阅读 · 0 评论 -
lc98. 验证二叉搜索树_深度优先
原题链接为了对比,给出广度优先算法的一般代码格式(自己总结的,若有出入,还望纠正):void backtrack(int depth){ if(depth is the bottom of the tree){ cul the requested ans; return; } for(int i = begin of width; i < end of width; i++){ add Num related to i; backtrack(depth + 1); pop原创 2020-06-01 16:52:06 · 266 阅读 · 0 评论 -
lc93. 复原IP地址_回溯法
原题链接我的回溯函数返回的是分段方法,是一组四元向量。如[3,3,2,3]表示IP地址的点分十进制的4个数分别是3位数,3位数,2位数,3位数。主函数中再将其对应到具体的IP地址class Solution {public: vector<int> pos; vector<vector<int>> ansPos;public: int Num(char cArr[], int start, int end){ int ans原创 2020-05-31 16:27:38 · 281 阅读 · 0 评论 -
lc92. 反转链表 II_三指针法
原题链接本题本来想开始就设置头节点,但不知道为什么使用头节点后结果如下:所以只好只在m==1时使用头节点,其他时候不用。三指针部分如下 subHead = subTill->next; subTill->next = subHead->next; subHead->next = head->next; head->next = subHead;其中,head是 链表待反转部分 前的链表序列的最后一个节点。上面代码始终保证了原创 2020-05-27 23:24:53 · 222 阅读 · 0 评论 -
lc65. 有效数字_有限向量机
原题链接参考java编译器词法分析程序的写法,有限向量机如下图所示:对应程序如下:class Solution {public: bool isNum(char c){ if(c - '0' >= 0 && c - '9' <= 0) return true; return false; } bool isNumber(string s) { char charArr[s.size() + 1];原创 2020-05-27 09:45:37 · 464 阅读 · 0 评论 -
lc59. 螺旋矩阵 II
原题链接参考lc54中“C++详细题解”,可以描述为一种“动态边界”的循环。需要注意先初始化答案vector<vector<int>>到指定大小并填0,否则会有空指针错误class Solution {public: vector<vector<int>> generateMatrix(int n) { vector<vector<int>> ans; for(int i = 0; i &.原创 2020-05-24 20:43:53 · 252 阅读 · 0 评论 -
lc56. 合并区间_双指针法
原题链接在不考虑输入序列中左边界与右边界对应关系下的解法,依据为每个区间左边界小于等于右边界交叉区间中必存在区间A的右边界大于等于区间B的左边界class Solution {public: vector<vector<int>> merge(vector<vector<int>>& intervals) { vector<int> first; vector<int> .原创 2020-05-23 17:29:47 · 218 阅读 · 0 评论 -
lc54. 螺旋矩阵
原题链接中文版lc的题解中,“C++详细题解”和我的方法思路相同,但代码更简洁。我的出发点是,每次行/列中已被访问过的元素数为如下数组:allreadyVisited = [0,1,1,2,2,3,3,4,4,5,5,6,6…];除了第一项0,其他项都是成对出现的,而且已被访问过的数总是对半分配在当前要访问行/列的头部和尾部class Solution {public: vector<int> spiralOrder(vector<vector<int>&g原创 2020-05-23 15:59:47 · 288 阅读 · 0 评论 -
lc45 条约游戏II
原题链接回溯法class Solution {public: int step = 0; int size; int min_step;public: void oneStep(vector<int>& nums, int pos){ if(pos == size - 1){ min_step = min(min_step, step); return; }原创 2020-05-19 20:14:11 · 165 阅读 · 0 评论 -
lc44.通配符匹配_算法与优化
原题如下:给定一个字符串 ( s) 和一个字符模式 ( p) ,实现一个支持 ‘?’ 和 ‘*’ 的通配符匹配。'?' 可以匹配任何单个字符。'*' 可以匹配任意字符串(包括空字符串)。两个字符串完全匹配才算匹配成功。说明:s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。链接:https://leetcode-cn.com/problems/wildcard-matching思路:分治法看到这题,我最开始想到的是lc原创 2020-05-18 18:16:39 · 291 阅读 · 0 评论 -
大数乘法(java字符串相乘)
大数乘法(java字符串乘法)先看一下在 leetcode 上的执行结果:可以看到,这里有空间换时间的问题原题给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。说明:num1 和 num2 的长度小于110。num1 和 num2 只包含数字 0-9。num1 和 num2 均不以零开头,除非是数字 0...原创 2020-03-16 17:07:19 · 1158 阅读 · 0 评论