![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
书海漫舟
当你的实力不足以支撑自己的野心的时候,所谓的野心也就不足为道了
展开
-
434.字符串中的单词数-力扣
这道题主要就是空串和空格的影响,只要将这两个问题解决,那么这道题也就解完了我的思路是统计空格的个数,由于头尾的空格和中间的多个空格可能会对结果产生影响所以在程序的开始,先去掉字符串头部和尾部的空格,此时如果左指针 i 比右指针 j 大,那么证明这是一个完全的空格串,返回 0,如果相反,那么证明肯定会有单词,由于统计的是中间的空格数,按照两点之间有一个空格的思维,单词数=空格数+1,所以置 temp=1,如果遇到了空格,就跳过当前以及后续可能挨着的空格,重复执行。class Solution {原创 2021-10-07 20:15:00 · 104 阅读 · 0 评论 -
22-括号生成(力扣)
几个月前这道题让我绞尽脑汁,但是在学了算法之后,看到这个的第一个想法是是不是可以用动态规划填表格的形式解出来,但是动态规划要求有大量的重复计算,所以很自然的画了一下括号生成的二叉树,发现并没有出现重复计算的结果,反而是可以用二叉树遍历的思维来组建括号,于是就开始找符合条件的树叶,发现二叉树的右侧 ‘)’ 的节点不能作为开始节点,而只能在左半边树遍历,如果要保证右括号左边始终有匹配的左括号,就得先遍历左节点,然后再遍历右节点,而且总共要遍历的深度是 2 * n,左括号的数量等于右括号的数量,所以可原创 2021-09-22 11:30:00 · 103 阅读 · 0 评论 -
算法——938、二叉搜索树的范围和(力扣)
可以采用中序遍历的方式将数据保存在一个数组里面,然后对数组进行遍历加,也可以在树遍历过程中直接把得数加起来。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNo原创 2021-04-27 08:09:39 · 51 阅读 · 0 评论 -
算法——897、递增顺序搜索树(力扣)
这是一道树的中序遍历和递归创建的题目,中规中矩做即可。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nul原创 2021-04-25 20:58:31 · 83 阅读 · 0 评论 -
算法——8、字符串转换整数(力扣)
这道题只要取字符串的最前面一位数字,然后每取一位乘上权值10就OK了,需要注意的是进行溢出的判断。class Solution {public: int myAtoi(string s) { int x = 1, i = 0, n = s.length(), sum = 0; // 去除掉前面的空格 while(s[i] == ' ') { ++i; } // 进行正负的判断 if原创 2021-04-21 18:37:31 · 82 阅读 · 0 评论 -
算法——11、盛最多水的容器(力扣)
这道题用贪心的思想,从最大的柱子间隔开始,每一次保留最大的柱子。class Solution {public: int maxArea(vector<int>& height) { int max = 0, i = 0, j = height.size() - 1; while(i != j) { if(min(height[i], height[j]) * (j - i) > max)原创 2021-04-20 18:34:56 · 76 阅读 · 0 评论 -
算法——179、最大数(力扣)
要找到最大的数,就是找到最高位最大的数放到最前面,由于每一个数都是不定长的,而且 c++中的string可以相互比较,所以可以将所有的数字都组合在一起,然后通过字符串拼接之后再进行比较的方式,将所有组合最大的放到最前面,然后将这些字符串连接起来就是所要的答案class Solution {public: string largestNumber(vector<int>& nums) { vector<string> tar; st原创 2021-04-12 16:44:07 · 232 阅读 · 0 评论 -
算法——114、二叉树展开为链表
先按照先序遍历用队列保存所有的元素结点,然后将这些结点组合成为一个完整的链表/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x原创 2021-04-12 15:02:58 · 75 阅读 · 0 评论 -
算法——103、二叉树的锯齿形层序遍历
和 102、二叉树的层序遍历类似,只要加入一个标志变量 ok,让他来决定是正序还是逆序,如果是正序的话,就完全是二叉树层序遍历的代码,如果是逆序的话,那就先将数据存储到一个栈里面,之后从栈里面移动到 temp 里面,加入 target 即可。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * T原创 2021-04-12 15:03:10 · 66 阅读 · 0 评论 -
算法——98、验证二叉搜索树(力扣)
这道题的二叉搜索树的中序遍历是一个升序排列的无重复数字的有序序列,所以可以先把二叉树的遍历结果保存起来,然后判断他是不是一个不断增加的序列就可以了/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr原创 2021-04-10 16:59:13 · 113 阅读 · 0 评论 -
算法——102、二叉树的层序遍历(力扣)
要一层一层的遍历,所以是树的广度遍历,借用队列来完成,由于要将每一层放到同一个向量中,所以每一次都要将队列里面的数据都读取完毕,设立一个变量来保存当前的队列的初始大小,然后每一次 while 中进行一次小的 for ,来构造当层的向量。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * Tree原创 2021-04-10 16:50:29 · 84 阅读 · 0 评论 -
算法——92、反转链表(力扣)
设立两个队列,一个栈,由于他两边是要求按照原来的顺序返回的,所以两边用队列保存,中间要求翻转,刚好符合栈的逆序输出,所以用栈保存中间数据,之后将三个数据结构重新组装起来就好了。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int原创 2021-04-10 16:21:43 · 86 阅读 · 0 评论 -
算法——367、有效的完全平方数(力扣)
可以用遍历求乘积的方式来看 i * i 是否能够等于 num,但是这样尝试之后发现超存储空间了,所以反向思考一下,让 num / i 和 i 比较不就可以了吗,于是将乘法代码改成了除法代码,如下class Solution {public: bool isPerfectSquare(int num) { for(int i = 1; i < num; ++i) { if(num / i == i && num % i原创 2021-04-10 16:06:04 · 63 阅读 · 0 评论 -
算法——172、阶乘后的零(力扣)
第一种思路:每一次求阶乘,截断最后面的零,取最后面的一部分,这种方法有很大的偶然性,不适合一般计算,下面的 sum %= 10000 是小编疯狂的提交最后的出来的结论,仅对此题有效。class Solution {public: int trailingZeroes(int n) { int sum = 1, target = 0; while(n >= 1) { sum *= n; --n;原创 2021-04-10 15:25:40 · 112 阅读 · 0 评论 -
算法——86、分隔链表(力扣)
先遍历一遍链表,然后用队列将每一个结点存起来,大于等于 x 的存到 end_list,小于 x 的存到 before_list 里面,之后只需要先遍历 before_list 再遍历 end_list 就可以将链表完全复原,需要注意的是,存储原来的节点的时候是没有将节点的 ->next 置空的,所以在每一次取出元素的时候都要将 ->next 置空,否则会出现最后返回的链表有循环的情况出现。/** * Definition for singly-linked list. * struct L原创 2021-04-10 11:18:19 · 75 阅读 · 0 评论 -
算法——82、删除排序链表中的重复元素2
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next)原创 2021-04-10 10:33:44 · 54 阅读 · 0 评论 -
算法——77组合(力扣)
类似于字符串的拼接,用递归的方式解决,我们平常拼接字符串的时候,总是从第一个位置开始,然后依次向后移动,这个代码也采用了这样的方式,为了避免重复,传入了 now 来取消掉重复项,用 i 来保存 temp 数字串的大小,用 temp 来保存临时字符串。class Solution {public: void _get(vector<int> temp, vector<vector<int>>& target, int i, int k, int n, i原创 2021-04-10 09:44:24 · 229 阅读 · 0 评论 -
算法——73、矩阵置零(力扣)
这道题矩阵置 0,可以采取之前的一道题叫做可以攻击国王的皇后的思路,先一次遍历,找到所有的为0的位置并记录,然后从所有是0的位置开始向上、右、下、左辐射,将碰到的所有元素都置零class Solution {public: void setZeroes(vector<vector<int>>& matrix) { vector<vector<int>> tar; vector<int> temp;原创 2021-04-10 08:51:30 · 151 阅读 · 0 评论 -
算法——5、是不是丑数(力扣)
由于丑数的定义是只包含 2、3、5 这样的因子的数,所以每次都给他除以一个他所能承受范围内的最大的因子,最后如果除到了 1,则说明该数是丑数,否则该数就不是丑数,只需要注意 0 的情况就可以了,毕竟 0 在这个思路里还是需要单独考虑的。class Solution {public: bool isUgly(int n) { if(n == 0) { return false; } while(n != 1)原创 2021-04-10 08:37:43 · 84 阅读 · 0 评论 -
算法——203、移除链表元素(力扣)
用两个指针遍历链表,第一个指向当前元素的前一个,第二个指针指向当前元素链表,如果当前元素等于 val,则改变第一个指针的指向和当前指向,删掉链表,否则一直向下遍历/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : va原创 2021-04-09 19:27:59 · 111 阅读 · 0 评论 -
算法——54、螺旋矩阵(力扣)
按照顺序循环遍历整个矩阵,需要注意的是,当向右、向下、向左、向右的时候,每一次循环后边界都会发生变化,这时候需要用两个num、num1 来控制更新边界信息,另外,还需要在每一次移动之后加上判断截止的条件class Solution {public: vector<int> spiralOrder(vector<vector<int>>& matrix) { int row = matrix.size(), col = matrix[0]原创 2021-04-09 19:17:42 · 271 阅读 · 0 评论 -
算法——48、旋转图像(力扣)
先用一个队列来保存原来矩阵里面的数据,然后按照列逆序,行顺序的方式遍历整个矩阵,并且完成赋值操作。class Solution {public: void rotate(vector<vector<int>>& matrix) { queue<int> temp; int i = 0, n = matrix.size(); for(; i < n; ++i) {原创 2021-04-09 16:57:21 · 75 阅读 · 0 评论 -
2021-04-09
先调用系统函数对给定的数组排序,然后定义一个变量 tar 保存当前最小的未匹配的数字,然后通过遍历找到第一个为 1 的位置,进入下一个循环,在下一个循环里查找 tar 是否出现,未出现就 return tar,否则继续进行循环。class Solution {public: int firstMissingPositive(vector<int>& nums) { sort(nums.begin(), nums.end()); int i =原创 2021-04-09 16:38:18 · 49 阅读 · 0 评论 -
算法——136、只出现一次的数字(力扣)
先排序,然后两个两个一组遍历,如果不足两个,那么剩余的这一个即为所求。class Solution {public: int singleNumber(vector<int>& nums) { sort(nums.begin(), nums.end()); int n = nums.size(), i; for(i = 0; i + 1 < n; i += 2) { if(nums[原创 2021-04-09 11:15:22 · 100 阅读 · 0 评论 -
算法——46全排列(力扣)
这里要打印出所有的可能组合,所以采用递归的方式来解决问题,先设立一个标志数组,判断该位置是否被访问过,避免结果出现重复,然后递归访问 nums 变量,将可能的结果存储下来class Solution {public: typedef bool* Bool; // 是为了验证这种方式下的值传递能否回溯,结果是不能 void Get(vector<vector<int>>& tar, vector<int> nums, vector<int原创 2021-04-09 10:51:34 · 206 阅读 · 0 评论 -
算法——45、跳跃游戏2(力扣)
先用数组记录每一个位置能够跳到的最大的位置,然后从0开始遍历,每一次都选择可以调到最远位置的那个位置作为下一个位置,直到到达终点为止。class Solution {public: int jump(vector<int>& nums) { int i, temp_i, n = nums.size(), * state = new int[n], max, sum = 0; if(n <= 1) {原创 2021-04-09 10:26:42 · 155 阅读 · 0 评论 -
算法——154、寻找旋转排序数组中的最小值(力扣)
使用了一种最简单粗暴的方式,暴力循环。class Solution {public: int findMin(vector<int>& nums) { int i = 1, min = nums[0], n = nums.size(); for(; i < n; ++i) { if(min > nums[i]) { min = nums[原创 2021-04-09 07:55:45 · 70 阅读 · 0 评论 -
算法——43、字符串相乘(力扣)
对于两个字符串相乘,我们可以将它分解成为小学生的运算方式,即列竖式运算方式,每一次取 num1 的最后一位,与 num2 的最后一位、最后两位—最开始一位相乘,将结果爆粗到队列 temp 里,由于是从最后一位相乘,所以队头放置的是得到结果的最后一位,然后在将队列中的元素加入到 tar 中,最后逆序将 tar 转移到一个string中图解:123 * 123第三次运算只要模仿前两次就可以了然后最后由于 tar 中保存的是结果的一个逆序组合,所以最后要逆序遍历class Solution {pub原创 2021-04-08 21:00:39 · 193 阅读 · 0 评论 -
算法——34、在排序数组中查找元素的第一个和最后一个位置(力扣)
方法一、用两个指针分别从前和从后遍历,找到第一个和最后一个元素class Solution {public: vector<int> searchRange(vector<int>& nums, int target) { int i = 0, j = nums.size() - 1; vector<int> tar; while(i < nums.size()) {原创 2021-04-08 19:09:21 · 101 阅读 · 0 评论 -
算法——153、寻找旋转排序数组中的最小值(力扣)
由于原来是一个升序数组,并且涉及到了旋转问题,所以用循环数组的思想,设置一个循环变量,然后遍历,一直找到非升序的那个元素返回即可。class Solution {public: int findMin(vector<int>& nums) { int i = 0, n = nums.size(); while(nums[i % n] < nums[(i + 1) % n]) { ++i;原创 2021-04-08 10:23:00 · 65 阅读 · 0 评论 -
算法——24、两两交换链表中的节点(力扣)
这是一道链表交换的题,交换两个链表需要至少三个指针,这道题主要的考点在于指针可能越界,所以为了保证100%的正确,忆阳在代码里加了大量的越界判断语句,代码里用before代表要交换两个节点的头一个的前一个,begin表示要交换两个节点的头一个,now表示要交换的两个节点的后一个,让我们来看代码。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; *原创 2021-04-07 20:27:09 · 90 阅读 · 0 评论 -
算法——31、下一个排列(力扣)
从官方大哥那里学来的题解,先找非降序的最后一个元素,然后找到最后一个比他大的数据,之后交换两个数之后对后面部分的进行升序排序。class Solution {public: void nextPermutation(vector<int>& nums) { int n = nums.size(); if(n <= 1) { return ; } int temp_i原创 2021-04-07 19:55:11 · 58 阅读 · 0 评论 -
算法——17、电话号码的字母组合(力扣)
由于要找到字符的不定长随机组合,所以采用递归的形式解题,题目设立了 target 保存要 return 的结果,temp 保存临时的字符串,index 保存当前在 digits 的索引位置,num 保存对应数字的可能字母组合, temp_i 用来记录当前位置的字符class Solution {public: void getNum(vector<string>& target, string temp, string digits, int index, vector<原创 2021-04-07 18:13:32 · 97 阅读 · 0 评论 -
算法——6、Z字形变换
由于将输入的字符串分割成了 numRows 行,所以可以设立一个 numRows 大小的向量,每个向量内部是一个string,每一次通过模拟 Z 字形的变换过程将对应的字符加到对应的行之后,最后将所有的行汇总到一起,得到最终的输出。class Solution {public: string convert(string s, int numRows) { vector<string> a; int z; // 初始化 numRows原创 2021-04-07 17:08:14 · 74 阅读 · 0 评论 -
算法——80删除有序数组中的重复项2
用遍历和c++ 的迭代器,设立一个长度为3的扫描区间,只要出现了区间端点相同的情况,那么就是有大于等于三个相同数字出现了,任意删掉一个就行。class Solution {public: int removeDuplicates(vector<int>& nums) { if(nums.size() <= 2) { return nums.size(); } vector<in原创 2021-04-06 11:23:45 · 55 阅读 · 0 评论 -
算法——1222、可以攻击国王的皇后
这道题说皇后可以横着走,斜着走,而且只有中间没有子的皇后才能攻击到国王,所以可以建立一个8 * 8 的矩阵用来当棋盘,第一步先将所有的皇后转化成棋盘上的一个点,然后从国王的位置向东、南、西、北、东北、东南、西北、西南扩散,找到第一个皇后存到 target 里面,然后后面的皇后就置之不理,由此得到的 target 就是能攻击到国王的第一个子了。class Solution {public: void Get(vector<vector<int>>& queen原创 2021-04-05 19:31:27 · 103 阅读 · 0 评论 -
算法——1535、找出数组游戏的赢家
这道题每一次比较,都将较小值放到数组最后,将最大值放到数组第一位,下标的变化满足循环数组的下标变化规律,除此之外,这道题有个隐含的条件,就是当 k 的值大于等于 n - 1的时候,就是在求整个数组的最大值class Solution {public: int getWinner(vector<int>& arr, int k) { int i = 0, z = 1, n = arr.size(); // z 是胜出次数记录器 /* 判断是不原创 2021-04-05 18:18:05 · 121 阅读 · 0 评论 -
算法——88、合并两个有序的数组
简单的分治思想,典型的归并排序,大多数数据结构或者算法书上应该都有,就不做过多介绍了,直接上代码class Solution {public: void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) { vector<int> temp; int i = 0, j = 0; while(i < m &&原创 2021-04-05 14:43:43 · 77 阅读 · 0 评论 -
算法——53、最大子序和
答案是从官方那里学来的思路,感觉挺不错,就自己编了一下做个记录。class Solution {public: int maxSubArray(vector<int>& nums) { int i, max = nums[0], z = 0; for(i = 0; i < nums.size(); ++i) { if(z <= 0) {原创 2021-04-04 18:01:47 · 59 阅读 · 0 评论 -
算法——781、森林中的兔子
分析题目可以知道,如果是相同的兔子颜色,那么他们报出来的数字是一样的,而反之,报出数字一样的兔子,颜色可能不同,所以对于相同数字,有两种情况,一种是假设报的数字是 y,那么最多有 y + 1 只兔子报这个数字的是同一个颜色,而下一个报 y 的是另外一个颜色的兔子,所以可以对数据先进行排序,然后进行剪枝class Solution {public: int numRabbits(vector<int>& answers) { int i = 0, n =.原创 2021-04-04 10:37:04 · 96 阅读 · 0 评论