LeetCode刷题系列
本专栏主要记录自己刷题过程,基本保证每天刷一道题
希望可以借此提高自己的编程能力
Amazingren
Do you prefer to sell sugar water for the rest of your life or come with me and change the world?
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【LeetCode刷题】-C++-简单-108-将有序数组转换成二叉搜索树
Task: 思路与代码 思路: 首先,得明白什么是二叉搜索树: 看来一下百度百科 二叉搜素数的意思: 左子树的值小于根节点的值; 右节点的值大于根节点的值; 好了那么本题的意思是高度平衡二叉树,意思就是每个节点的左右两个子树的高度差的绝对值不超过1,那完美了,就二分吧,这样就满足不超过一的条件,大概思路: (1)把给定的已经排好序的数组二分,得到中点mid位置; (2)用这个中点当做这个树...原创 2019-06-28 10:47:31 · 562 阅读 · 0 评论 -
【LeetCodes刷题】-C++-简单-107-二叉树的层次遍历II
Task: 思路与代码: 还是用递归的思想,要读懂题目,反向输出的是一个int类型二维数组,所以就是vector<vector<int>> 那么思路就出来了: (1)创建二维数组: (2)往数组里添加树的值(正向添加); (3)对创建的二维数组反向排序然后输出; 这里重要的步骤就是第二步, 就需要遍历树,这里设置一个level的变量,用来记录遍历到树的第几层,也就是树的深...原创 2019-06-28 10:18:53 · 378 阅读 · 1 评论 -
【LeetCode刷题】-C++-简单-104-二叉树的最大深度
Task: 思路与代码: 有了递归的思想之后这样的题目看起来还是蛮简单的,就是自己调用自己,给定一个节点, (1)如果节点为空,那就直接返回0; (2)否则(这个节点不是空的),那就用max函数找这个节点的最大深度(左孩子的深度和右孩子的深度中取最大的) (3)然后max里面又调用了函数本身,这就是递归,意思就是对于刚刚那个节点的左孩子和右孩子也是一样的,比如左孩子,那我们又以左孩子为当前节点,...原创 2019-06-28 09:15:47 · 458 阅读 · 0 评论 -
【LeetCode刷题】-C++-简单-101-堆成二叉树
Task: 思路与代码: 思路: 题目要求的是判定给定的二叉树是不是堆成的,那么什么样的树才是堆成的呢? 那就基本是第一个例子给出的完全二叉树了,否则怎么也不可能对称(比如那些缺胳膊少腿的肯定就不对称啊!)if( tree1 == NULL || tree2 == NULL) return false; 然后就是就镜像相等!镜像相等镜像相等! 所以这里同一个IsMirror()函数来实现, 条件...原创 2019-06-26 09:39:35 · 341 阅读 · 0 评论 -
【LeetCode刷题】-C++-简单-100-相同的树
Task: 思路与算算实现 对树有个稍微的了解先,看代码里给的定义: 可以看出树 有值:val; 有左右节点:left 和right; 有形式:节点:结点值、左孩子、右孩子、 那么题目要求就是两个树一样,那就节点,左孩子,右孩子都一样! 所以首先边界检查: (1)两个树都是空的,那没错了就是一毛一样; (2)如果都不空且值还相等,那就用递归的形式再去判断:这里条件就是看这个节点的左子树和右...原创 2019-06-25 09:42:03 · 458 阅读 · 0 评论 -
【LeetCode刷题】-C++-简单-88-合并两个有序数组
Task: 解法和思路: class Solution { public: void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) { int i = m - 1; int j = n - 1; while(i >= 0 ...原创 2019-06-23 11:55:19 · 266 阅读 · 0 评论 -
【LeetCode刷题】-C++-简单-83-删除排序链表中的重复元素
Task: 思路与解法: 【解法一:双指针思路快慢指针法】 (1)首先还是便捷检查,如果链表为空或者链表只有一个,那就直接返回链表; (2)常规情况: 快慢指针一个在前一个在后,进行遍历, 遇到元素相等的时候,如果快指针已经到头了,那就直接让慢指针的下一个元素指到NULL,如果没有到头,那就把快指针的下一个指给慢指针的next,然后再把快指针的下一个元素的赋值给快指针,相当于之前的q就没有了! ...原创 2019-06-23 11:36:15 · 521 阅读 · 0 评论 -
【LeetCode刷题】-C++-简单-198-打家劫舍
Task: 思路: 【解法一:遍历,奇偶分别求和】 思路参考: 首先这个题目,要明白的就是,偷了一间房子,那么与之直接相连接的房子是不能再去偷了,不然就要被抓住完蛋了! 那么就要隔间偷,所以首先想到的就是分为奇偶数进行,但是这样有一个问题: 我们的目标是要偷到的金额最大,那么只偷奇数或者只偷偶数就不能保证是最大的:因为可能有一段是奇数家的钱多,有一段是偶数家的qia多,所以需要找准一个时机。当...原创 2019-06-21 09:45:39 · 757 阅读 · 0 评论 -
【LeetCode刷题】-C++-简单-69-x的平方根
Task: 思路: 【方法1】内置函数: 当然本题的初衷当然不是让这样做了,但是也要知道有一个内置函数可以用! 代码: class Solution { public: int mySqrt(int x) { return sqrt(x); } }; 【方法2】二分查找: 思路就是: (1)初始化边界i和j (2)找到中点mid= (i+j) / 2 (3)re...原创 2019-06-20 10:58:07 · 275 阅读 · 0 评论 -
【LeetCode刷题】-C++-简单-58-最后一个单词的长度
Task 思路: 题目让返回最后一个单词的长度,那么首先想到的就是能不能倒着遍历,遇到了倒数第一个单词后面的那个空格就停止,然后返回前面的单词的长度! 但是也有一些问题,比如最后一个单词后面并不就是结束,也有可能还是个空格,如果遇到这个空格就停下来的话,那就错误了,因此得设置flag来规避这种情况: 代码: class Solution { public: int lengthOfLas...原创 2019-06-19 10:20:42 · 353 阅读 · 0 评论 -
【LeetCode刷题】-C++-简单-53-最大子序和
Task: 解决方案: 【1】暴力循环: 思路: 两层循环,第一层控制总的进度,第二层负责加并且验证; 每当第一层循环给定一个起点,第二层循环就会从这个起点开始往后遍历加(先加一个,再加两个等等), 每次加完都会把新得到的sum的值和当前的最大值res_max进行比较,一直到把最大的sum赋给res_max才停止,否则就一直遍历寻找! 时间复杂度:O(n2) 代码: class Solution...原创 2019-06-19 09:54:31 · 354 阅读 · 0 评论 -
【LeetCode刷题】-C++-简单-38-报数
Task: 思路: 首先自己刚拿到这个题的时候真的是一脸蒙蔽,都不知道要干什么,但是仔细读题之后,发现读懂题才是这道题的关键所在。 看了几个示例,发现其实就是给定一个n,然后输出就是把n-1的那个数给报出来,这就是所谓的报数,也没啥难的,比如: 1; 11; 21; 1211 这三个例子,当n=1的时候,其实就是特殊情况;后面的就是通用的了。 当n=2的时候,返回的是11,意思就是:上一个(...原创 2019-06-17 09:48:29 · 401 阅读 · 1 评论 -
【LeetCodes刷题】-C++-简单-35-搜索插入位置
Task: 思路: (一) 遍历的方法: (1)首先要进行的还是边界检查,如果给的target比nums[0]还要小,那么就包含在遍历的情况之中,如果比nums[nums.size()-1]还大,那就要单独考虑一下; (2)遍历的过程就是判断和选择的过程,如果当前的nums[i]的值大于等于target的话: a)如果大于的话,就说明target就应该插在这个nums[i]的前面,反过来想就是把...原创 2019-06-16 10:54:25 · 275 阅读 · 0 评论 -
【LeetCode刷题】-C++-简单-21合并两个有序链表
Task: 思路: 这里用到了递归的思路: (1)首先还是边界检查: 看看两个链表是不是空的,如果其中一个是空的,那就直接返回另外一个有序链表就好了! (2)如果非空的话,那就正常进行: 比大小 如果L1的value小于L2的,那么就递归的把L2和L1的下一个值进行比较一直进行下去 如果L1的value大于L2的,那么就递归的把,L1和L2的下一个value进行比较再一直比较递归下去! 代码: ...原创 2019-06-15 17:12:04 · 457 阅读 · 3 评论 -
【LeetCode刷题】-C++-简单-20-有效的括号
Task: 思路 (1)首先还是边界检查,如果是给的空的字符串,那就直接给设定为有效字符串,返回true; (2)然后看看这个字符串能不能被2整除,如果不能被2整除,那就肯定不是有效括号; (3)排除了边界就要来到我们的算法的部分: a) 利用栈,遍历给定的字符串string s; b) 遇到左括号就压栈; c) 遇到右括号首先对这个时候栈是否为空(如果不为空则继续) d) 这个时候指定当前括号...原创 2019-06-15 16:26:21 · 571 阅读 · 0 评论 -
【LeetCode刷题】-C++-简单-罗马数字转整数
Task: 思路: 首先最需要注意的就是把题目读懂,弄懂规则,这里最重要的就是下面的两个信息: 可以看到需要特殊处理的就是I X 和 C 三个字符,他们分别在自己后面的两个数的左边和右边代表着不同的意思, 就拿I和V来说,如果I在V的左边那就是要用V减去I,如果I在V的右边,那就直接是V加上I, 剩下的也是一样的规律 所以,我们需要注意! 过度到算法: 上面列出了基本的规则,下面...原创 2019-06-14 16:44:23 · 451 阅读 · 0 评论 -
【LeetCode刷题】- C++-简单-9回文数
Task: 思路: 边界检查:看题目,首先是边界检测: 从例子以及题目要求看出: 1.复数是不行的; 2.末尾是0的但是这个数字又不是0的数字是不行的(因为末尾是零的回文数字只有它自己!) 所以排除,是上面这两样的就直接返回false! 算法: 既然有了上面的建设而且昨天刷了整数翻转的题目,那就考虑把给定的数的一半给反过来,如果这个反过来的一半的数字和留下来的另外一半相当,那就是回文数字...原创 2019-06-14 11:32:00 · 458 阅读 · 0 评论 -
【LeetCode刷题】-C++-简单-7-整数反转
Task: 思路: 主要是处理溢出,就是时时刻刻我们新的反转后的数组num要在[-2的31次方, 2的31次方- 1]这个区间之中,多以每次都要进行溢出的判断,如果溢出就返回0,没有溢出那就继续操作来翻转整数! 代码: class Solution { public: int reverse(int x) { int num = 0; while(x){ ...原创 2019-06-13 16:03:11 · 234 阅读 · 0 评论 -
【LeetCode简单题】-两数之和
Task: 思路: 暴力算法: 时间复杂度是O(n2) (1)遍历整个数组找到nums[i] (2)从nums[i]之后的元素开始遍历,得到nums[j] (3)判断nums[i]和nums[j]的值是不是相等,如果是的话返回两个下标 Hash Map的解题思路: (1)建立存放结果的向量result; (2)构建一个一一对应的map,都是int类型 (3)遍历数组 a)记录每一个...原创 2019-06-13 09:45:07 · 237 阅读 · 0 评论 -
【LeetCode刷题】-岛屿数量
Task: 思路: 1.首先判断给定的二维数组是不是空的; 2.对二维数组遍历一下,对每个元素进行判断, a)如果这个值等于1, 那么就把计数器+1, 并且对该元素四周进行深度搜索, 3.返回 代码: class Solution { public: int numIslands(vector<vector<char>>& grid) { ...原创 2019-06-12 10:37:57 · 888 阅读 · 0 评论 -
【LeetCode刷题】- 设计循环队列
Task: 思路: 完全没有思路,相当于学习了,抄几道题 代码: class MyCircularQueue { private: vector<int> a; int max; public: /** Initialize your data structure here. Set the size of the queue to be k. */...原创 2019-06-05 09:29:23 · 1364 阅读 · 0 评论 -
【LeetCode刷题】- 移动零
Task: 思路 遍历一次数组,将数组中非零元素与此时数组中第一个零元素交换位置。 代码: class Solution { public: void moveZeroes(vector<int>& nums) { int k = 0; for( int i = 0; i < nums.size(); i++){ ...原创 2019-06-04 09:09:03 · 273 阅读 · 0 评论 -
【LeetCode刷题】-翻转字符串的单词III
Task: 思路: 字符串这里我不太行 代码: class Solution { public: string reverseWords(string s) { int n=s.length(); vector<int> temp; for(int i=0;i<n;i++) { ...原创 2019-06-03 10:49:36 · 226 阅读 · 0 评论 -
【LeetCode刷题】-杨辉三角2(输出第K行)
Task: 思路: 这个还是不太清楚,二刷的时候好好看! 代码: class Solution { public: vector<int> getRow(int rowIndex) { rowIndex++; if(rowIndex<=0){ return {}; } else if...原创 2019-06-03 10:36:06 · 455 阅读 · 0 评论 -
【LeetCode刷题】- 长度最小的子数组
Task 思路: 一个一个过,每增加一个计算一次综合sum, (1)如果计算出来的sum小于目标的值,那么就继续走; (2)如果计算出来sum的值>= 目标值,那么就记录一次此时的长度,保存在minlen中,然后把左端点+1,并且把前一个点的值减掉,然后 (3)继续判断此时的和是否和目标值一样吗,如果小于的话退出while,开始for,如果还是大于或者等于,就继续把左端点右移一位,并且减去...原创 2019-06-03 09:44:28 · 297 阅读 · 0 评论 -
【LeetCode刷题】- 最大连续1的个数
Task: 思路: (1)设置两个计数变量res 和count,前者记录到目前为止的1的个数,后者记录每个新的连续的有1的个数; (2)遍历: a) 如果等于1,那就给count+1; b) 如果不等于1,那就把count置为零,从新开始下一轮的开始; c) 然后把当前count的1的个数和res的比一下大小,把大的留下来 (3) 最后返回结果 代码: class Solution { pub...原创 2019-05-31 11:08:06 · 398 阅读 · 0 评论 -
【LeetCode刷头】 -移除元素
Task: 思路: 遍历一遍数组,只要遇到和val值不相等的元素,就依次复制到数组的每一位,当遍历完成也就把任务完成了! 代码: class Solution { public: int removeElement(vector<int>& nums, int val) { int res = 0; for (int i = 0; i ...原创 2019-05-31 09:10:31 · 211 阅读 · 0 评论 -
【LeetCode刷题】-两数之和 II - 输入有序数组
Task: 思路: 比较暴力的方法:两次循环: 代码: 方法一:暴力算法 class Solution { public: vector<int> twoSum(vector<int>& numbers, int target) { vector<int> vRet; for(int i=0; i < nu...原创 2019-05-29 23:56:10 · 265 阅读 · 0 评论 -
【LeetCode刷题】-数组拆分I
Task: 思路: 要满足条件: (1)一对里面取最小; (2)总体里面取最大; 所以(2)是首要考虑的,那么一对取最小就不能损失太多,那么怎么样的损失才不算太多呢?那就是连续的取最小才不会损失太多,所以其实就是排序后求奇数和! 代码: class Solution { public: int arrayPairSum(vector<int>& nums) { ...原创 2019-05-28 08:50:50 · 274 阅读 · 0 评论 -
【LeetCode刷题】
Task: 思路: 亦或的思路; 代码: class Solution { public: void reverseString(vector<char>& s) { for(int i = 0; i < s.size()/2; ++i){ s[i] ^= s[s.size()-1-i]; s[s....原创 2019-05-24 22:05:23 · 197 阅读 · 0 评论 -
【LeetCode刷题】-最长公共前缀
Task: 思路: 遍历,逐行扫描! 代码: class Solution { public: string longestCommonPrefix(vector<string>& strs) { if(strs.empty()) return ""; for(int i=0;i<strs[0].size();++i){ ...原创 2019-05-24 10:08:11 · 296 阅读 · 0 评论 -
【LeetCode刷题】- 实现strStr()
Task: 代码: class Solution { public: int strStr(string haystack, string needle) { if(needle.size() == 0) return 0; for(int i = 0; i < haystack.size(); i++){ ...原创 2019-05-22 09:16:09 · 206 阅读 · 0 评论 -
【LeetCode刷题】- 二进制求和
题目: 思路: 用了两个指针分别指向a和b的末尾,然后每次取出一个字符,转为数字,若无法取出字符则按0处理,然后定义进位carry,初始化为0,将三者加起来,对2取余即为当前位的数字,对2取商即为当前进位的值,记得最后还要判断下carry,如果为1的话,要在结果最前面加上一个1 代码: class Solution { public: string addBinary(string a,...原创 2019-05-21 09:25:16 · 305 阅读 · 0 评论 -
【LeetCode刷题】-杨辉三角
任务: 思路: 向量二维数组的表示,vector<vector> array; 然后对每一行rows进行处理,很容易观察出这样的表达式: rows[j]=(array[i-1][j-1]+array[i-1][j]); 处理完以后需要在末尾放入一。 代码: class Solution { public: vector<vector<int>> g...原创 2019-05-20 08:57:34 · 250 阅读 · 0 评论 -
【LeetCode刷题】-螺旋矩阵
Task: 思路: 设置四个边界,然后走一圈 代码: class Solution { public: vector<int> spiralOrder(vector<vector<int>>& matrix) { vector<int>re; if(matrix.empty() || matrix[0...原创 2019-05-19 09:21:17 · 345 阅读 · 0 评论 -
【LeetCode刷题】-对角线遍历
题目: 分析: 这道题给了我们一个mxn大小的数组,让我们进行对角线遍历,先向右上,然后左下,再右上,以此类推直至遍历完整个数组,题目中的例子和图示也能很好的帮我们理解。由于移动的方向不再是水平或竖直方向,而是对角线方向,那么每移动一次,横纵坐标都要变化,向右上移动的话要坐标加上[-1, 1],向左下移动的话要坐标加上[1, -1],那么难点在于我们如何处理越界情况,越界后遍历的方向怎么变换。向...原创 2019-05-18 10:11:16 · 1368 阅读 · 1 评论 -
【LeetCode刷题】-加一
Task 思路: 思路就是从最低位循环开始向前检查当前位是否小于9,如果小于9就直接令当前位加1,返回数组即可,如果等于9就令当前位为0继续向前检查直到到达最高位为止,如果循环结束还没有返回值则说明此时数组里全是9,此时我们就返回一个最高位为1其余全为0且位数比原数多1位的数组即可 代码: class Solution { public: vector<int> plusOn...原创 2019-05-17 09:42:13 · 205 阅读 · 0 评论 -
【LeetCode刷题】-至少是其他数字两倍的最大数
题目 代码 class Solution { public: int dominantIndex(vector<int>& nums) { int index = 0; int maxNum = nums[0]; int secondMaxNum = 0; for (int i = 1; i < n...原创 2019-05-16 09:12:14 · 246 阅读 · 0 评论 -
【LeetCode刷题】- 寻找数组的中心索引
题目: 代码 class Solution { public: int pivotIndex(vector<int>& nums) { int len = nums.size(); int right = 0; int left = 0; for (int i : nums){ r...原创 2019-05-15 09:01:14 · 424 阅读 · 0 评论 -
【LeetCode刷题】-旋转数组
题目: 代码: class Solution { public: void rotate(vector<int>& nums, int k) { if (nums.empty()) return; if (k>nums.size()) k = k%nums.size(); vector<in...原创 2019-05-14 09:02:27 · 239 阅读 · 0 评论
分享