摘要:
题目 题解 可以看成两种情况 1.+1 后一位+1 如果等于10 取0 前一位+1 2.扩充 第一位+1 等于10 取0 插入1在开头 因此我们只需要一个变量记录是否进位了这题就会简单很多 就不多说了 代码已经能够看懂 代码 1 #include<iostream> 2 #include<vecto 阅读全文
摘要:
题目 题解 1.正则表达式 2.分情况讨论 3.有限状态自动机? 没学过啊哭 丢人了 代码(正则表达式 来自用户) 1 class Solution { 2 public: 3 static const regex pattern; 4 5 bool isNumber(string str) { 6 阅读全文
摘要:
题目 题解 在力扣 题目62- 不同路径和力扣 题目63- 不同路径II中采用了取每个方块的的左块次数和上块次数 那么我们这次可以改造 原本保存次数的地方 这次应当放入到该位置的最小值 这样最后一格只要比较一下大小加上自己即可 别忘了 上边和左边特殊处理 代码 1 #include<iostream 阅读全文
摘要:
题目 题解 基本思想在62题 我们只要让障碍物在的格子取0即可 代码 1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 5 class Solution { 6 public: 7 int uniquePathsWith 阅读全文
摘要:
题目 题解 很经典的动态规划题 dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; 你问我规律怎么来的? 列出来找啊 (笑) 其实就是求 dp[i][j] 那么可以求 有多少到达了他dp[i][j] 上面的那个格子和左边的格子 因为他们只差一步就到达了 代码 1 #inc 阅读全文
摘要:
题目 题解 化繁为简: 说是旋转但是我们观察可以发现其实就是 将倒数第(k % 链表长度)个开始到最后 将这些放在最前面 这里我使用了 vector<ListNode*> v; 去保存每一个ListNode*(当然这里也可以不使用vector) 那么最后置换时 1 (*(v.end() - k - 阅读全文
摘要:
题目 题解 我们只要确定从头确定 在多少位置即可 即 假如n=4 k=9 那么第一位数肯定是 1,2,3,4中的一个 由于k=9 所以根据大小排列以及平分(每个数是6 总排列有24个即4!)可以得到 第一个数应该是2 这样我们将2删掉 后面 继续前面的步骤即可 不过这样看起来很美好 但是根据大小排列 阅读全文
摘要:
题目 题解 在力扣 题目54--螺旋矩阵中我们有了遍历的方法 那么我们修改一下然后 遍历时按照从1开始放入不就可以了 代码 1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 int side(vector<vector< 阅读全文
摘要:
题目 题解 从后面开始遍历找到第一个不为空的位置 记录 然后继续遍历直到为空、 1 #include<iostream> 2 #include<string> 3 using namespace std; 4 class Solution { 5 public: 6 int lengthOfLast 阅读全文
摘要:
题目 题解 在力扣 题目56--合并区间中我们有了合并的方法 那么我们不是可以直接让newInterval加入intervals然后执行56题的方法不就行了 复杂度有点高 我们可以根据排列插入这样 能删掉一行sort 然后可以找一下合并的大概区间其他的不用动这样复杂度应该就会大大降低了 (我这里只删 阅读全文
摘要:
题目 题解 思路来自评论区大佬LWQ 将starti与endi 分开 以intervals = [[1,3],[2,6],[8,10],[15,18]]为例 分开之后(注意要排序) starts=[1,2,8,15] ends=[3,6,10,18] 那么我们如下图所示遍历 endsends的对角s 阅读全文
摘要:
题目 题解 我们可以记录一下跳之后的最远距离 并把能够跳到的位置记录 一下 比如我们 vector<int> loop(nums.size(), 0); 当某个数可以被跳入时 对应位置的loop变为1 以3,2,1,0,4为例 一开始跳3 那么我们将 2,1,0 loop位置改为1 这样遍历到4时l 阅读全文
摘要:
题目 题解 找四个边的范围然后根据规律放入即可 代码 1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 int side(vector<vector<int>>& matrix, vector<int>& result, 阅读全文
摘要:
题目 题解 最大和 返过来说不就是 和为负数的隔开 就可以了 即注意要比较一下最大值 -2,1,-3,4,-1,2,1,-5,4 -2 最大是-2 1,-3 是负数 最大是1 4 -1 2 1 -5 4 最大是6 结果 左边可以和为负数的隔开 代码 1 class Solution { 2 publ 阅读全文
摘要:
题目 题解 翻译一下即对角线 行 列不能出现多个棋子 有点像数组 那么应该用一个其他容器记录 当一个棋子被放入时 导致了哪些位置不能放入 1 vector<vector<int>>Standing(n, vector<int>(n, 0)); 2 for (int j = 1; j < Standi 阅读全文
摘要:
题目 题解 这题应该学过算法的人都熟悉不过了吧 其实只要对半分即可 即n=10;->n=5*5;->n=2*2*1*2*2*1; 也就是说无论n为多少总能变成2和1相乘的形式 那么n=1和n=2就是最基本的形式 要算10就要算5 算5就要算2*2*1 所以我们可以看到需要拿到里面的数才能算出外面的数 阅读全文
摘要:
题目 题解 代码1 使用multiset容器 multiset可以自动排序 1 multiset<int> transformation(string& str) { 2 multiset<int> res; 3 for (int i = 0; i < str.length(); i++) { 4 阅读全文
摘要:
题目 题解 虽然一开始走了弯路 但是竟然莫名其妙发现了规律 即斜反转然后轴反转 斜反转以右对角线 反转 轴反转以中线反转 代码 1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 class Solution { 5 pu 阅读全文
摘要:
题目 题解 46. 一看这个题目 发现和 力扣 题目31-- 下一个排列 类似 一个是找下一个 一个是找全部 那么我们把一开始nums进行排序从小到大 然后循环31题的题解 加入vector<vector<int>> res; 如果i为-1则退出 循环即可 47.同上 代码 46 1 #includ 阅读全文
摘要:
题目 1 45. 跳跃游戏 II 2 给你一个非负整数数组 nums ,你最初位于数组的第一个位置。 3 4 数组中的每个元素代表你在该位置可以跳跃的最大长度。 5 6 你的目标是使用最少的跳跃次数到达数组的最后一个位置。 7 8 假设你总是可以到达数组的最后一个位置。 9 10 11 12 示例 阅读全文
摘要:
题目 题解(来自力扣评论区大佬) ps:动态规划还是难啊 没想出来 哭了 在力扣 题目10-正则表达式匹配 下--这题有点难 中使用了动态规划法 即保留之前的结果 在遍历到当前结果时 根据某种规律去找上一次是否匹配 那么这题也是一样 不清楚的可以看这篇 大部分细节一致 可以直接看代码理解 代码 1 阅读全文
摘要:
题目 题解(方法来自力扣评论区大佬) 由于这个方法比较难以理解先跟着代码走一步看看吧 以 123*6为例 最后删掉0就是答案 那么思路就有点清楚了 其实就是乘法展开了 1.先拆成一个一个数 然后两个数相乘 2.得到的结果要与之前对应位数的值相加 3.得到的数/10就是进位 4.得到的数%10就是目前 阅读全文
摘要:
题目 题解 1.题目的思路 看见这个题 有点和力扣 题目11- 盛最多水的容器 有点相似 那么我们能不能也用左右指针的方法去做呢? 但是题目要求都不一样 那么左右指针应该代表比较合适呢? 我们可以发现 如下图 当left指向mid的左边最大值 当right指向mid的右边最大值 时 无论是横向计算还 阅读全文
摘要:
题目 题解 1.首先题目中提到我们只需要输出 最小的正整数即可 那么只看正数 0和负数都不看了 2.超过vector长度的数字也不用看 因为最好的结果 也就是1,2,3,4 5是解 也就是说最小的正整数的解 最大也就是vector的长度+1 而超过vector长度的自然也不用管 知道上面两个前提之后 阅读全文
摘要:
题目 题解 在力扣 题目39-- 组合总和中我们做过类似的题 而40题多加了条件 即 有重复数字而且每个数只能选一次 其实我们可以从39题条件转换一下,即无限制重复被选取->有限制重复被选取 例如 candidates = [2,5,2,1,2] 就是 1可以取1次 2可以取3次 5可以取1次 这样 阅读全文
摘要:
因为正好有个一个作业 所以随便在博客上写写 代码:https://gitee.com/akyaky/vue-cross-domain-test 数据库篇 数据库没什么好说的 数据什么的自己加 用sql语句或者可视化工具都行 这里我用的是mysql+Navicat Premium的组合 具体 如下 即 阅读全文
摘要:
题目 题解 这题一开始想投机取巧结果走了弯路 浪费了不少时间.. 呜呜呜 看见这种类似于比较大小的 先排序再说 然后我们可以这样想 每一轮从candidates中挑出一个数(从小到大)出来 每一轮的加和 和target比较 以candidates = [2,3,5], target = 8 为例 1 阅读全文
摘要:
题目 38. 外观数列 给定一个正整数 n ,输出外观数列的第 n 项。 「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。 你可以将其视作是由递归公式定义的数字字符串序列: - countAndSay(1) = "1" - countAndSay(n) 是对 coun 阅读全文
摘要:
题目 题解 在力扣 题目36-- 有效的数独中我们判断了一个数独是否有效, 那么这题我们只要让填入每一个数字后的数独表 也是有效的即可,那么我们就可以利用36题的思路 但是问题是填入的数字会影响其他数字的填入也会导致数独表是否有效, 所以我们需要回溯法 当无法填入数字(1-9在九宫格/行/列都有)时 阅读全文
摘要:
题目 题解 既然对行/列/九宫格有要求不能重复 那么我们把行/列/九宫格存放起来 然后判断是不是重复不就可以了。 先写三个容器 存放行/列/九宫格 1.字符放入 从上到下,从左往右 遍历(跳过. 具体遍历方法可以看代码) 先find一下看看原来的容器中有没有该字符 如果没有将遍历的字符放入三个容器( 阅读全文
摘要:
题目 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums = [1,3,5,6], target = 5 输出: 2 示例 2: 输入: nums 阅读全文
摘要:
题目 题解 改造二分搜索 具体说明在代码注释 代码 1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 vector<int> ersearch(vector<int>& nums, int target, int lef 阅读全文
摘要:
题目 题解 这题其实直接做还是比较简单的 找到旋转点 判断一下二分查找即可 但是不满足进阶的条件 进阶:你可以设计一个时间复杂度为 O(log n) 的解决方案吗? 看到O(log n) 我们就能想到二分查找 但是二分查找是有序的才能使用 由于nums是部分有序 那么我们能不能拆一下呢?即 以中间位 阅读全文
摘要:
题目 题解 在第20题 力扣 题目20-- 有效的括号 我采用了栈的方法匹配 那么这题应该可以利用栈去匹配 但是这题并不是问的一共匹配了多少 而是连续最长匹配了多少 我们想一下 通过栈可以找到所有匹配的括号 那么剩下的不就是没有匹配的吗? 以()(()为例 先vector<int> vec(s.si 阅读全文
摘要:
题目 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 - 例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列 阅读全文
摘要:
题目 题解 暴力解法(思路来自评论区的老哥) 这里应该将题目中给的vector改为unordered_map容器然后去查找才能比较快捷 代码 1 #include<iostream> 2 #include<vector> 3 #include<string> 4 #include<unordered 阅读全文
摘要:
题目 题解 说实话这题如果没有边界 直接做的话肯定不难 但是就是难在最大和最小了 首先 我们是不是要根据两个数的符号考虑到几种情况再分呢?其实是不用的 我们可以转换某一种情况 然后只要最后返回的时候知道是正是负即可 那么最方便还是同符号吧 那么考虑一下都是正数? 但是 我们要知道INT_MIN 是不 阅读全文
摘要:
题目 题解 一开始 不匹配所以往右移动 这时匹配成功 双方同时移动 当然上面的位置要保留要用其他变量去移动(如果双方同时移动过程中有不匹配直接break即可 然后将needle恢复至0 haystack从红色箭头继续遍历) 本来应该这时就结束了 但是因为我写的判断成功就会向右移动 所以最后应该是 即 阅读全文
摘要:
题目 题解 双指针 int left = 0; int right = nums.size()-1; 一开始 每次循环先从左边开始 for (; left < nums.size(); left++){} 先在右指针判断是否为Val 如果是Val 我们肯定就不能把这个值再给左指针了那就往左走 右指针 阅读全文
摘要:
题目 题解 递归:(ps:感觉我用递归用魔怔了 什么都用递归) 以下面为例 初始全为0 然后将j向右移动 需要注意的是j每轮从c位置移动 一样的 不改变 继续向右移动 此时不一样了 我们就需要重新调用函数 将k更新至k+1 而c至为j 即 此时我们将c,j所在的值赋给k 然后继续重复上面步骤 向右移 阅读全文