【leetcode】
吾之求索
https://github.com/Small-Cube
展开
-
leetcode【数组和字符串】-----49. Group Anagrams(字谜分组)
1、题目描述 、2、分析 其实就是把含有相同字符并且出现次数相同的分为一个组,我们可以使用map来统计,遍历当前数组,对每一个字符串进行排序,之后放入map中,最后再从map中取出结果。map的两个参数一个是排序后映射的字符串,第二个参数则是这个映射的字符串在原字符串数组中的各个表现,也就是第二个参数是一个字符串数组。3、代码class Solut...原创 2019-09-03 20:05:25 · 148 阅读 · 0 评论 -
leetcode【其他】-----461. Hamming Distance(汉明距离)
1、题目描述2、分析 求两个数的汉明距离,题目中给出了定义,也就是两个数的二进制数中不同的位的个数,这个题和之前求一个数的二进制中的1的个数很像,在求一个数的二进制中的1的个数需要将每一位与1相与,这道题我们也可以这样,将两个数的每一个位分别与1相与,如果结果相同表示两个位相同,不同则计数1,然后将传入的两个数右移一位抛弃掉计算过的位。3、代码class Sol...原创 2019-05-12 19:17:57 · 139 阅读 · 0 评论 -
leetcode【其他】-----268. Missing Number(缺失数字)
1、题目描述2、分析 这道题的含义是,给出n个数字,这n个数字范围在0-n之间,0-n一共有n+1个数字,找出其中没有出现的数字。一开始想法就是排序,然后二分查找,但是这个不符合题目中的时间空间复杂度。还有一种方法,通过计算,首先计算给出的数字的和,再计算0-n的数字应该有的和,相减就是没有出现的数字,应该有的和可以用等差数列求和来计算。还有一种方法是用位操作,异或的特性...原创 2019-05-16 18:12:33 · 209 阅读 · 0 评论 -
leetcode【其他】-----191. Number of 1 Bits(位1的个数)
1、题目描述2、分析 判断一个32位无符号数字中1的个数,应该算比较简单,只要用输入的数字不停地与1相与,结果为1则次数加一,然后将输入数字右移一位,循环32次就好。3、代码class Solution {public: int hammingWeight(uint32_t n) { int res=0; for(int...原创 2019-05-11 21:51:22 · 83 阅读 · 0 评论 -
leetcode【数学】-----13. Roman to Integer(罗马转整数)
1、题目描述2、分析 输入一个字符串,这个字符串是一个罗马数字,将这个罗马数字转为阿拉伯数字。首先罗马数字的字符一共只有那么几个,每一个字符代表一个数字,这样的话就需要判断每一个字符,需要知道对于出现的每一个字符代表的数字是应该加还是减。可以根据罗马数字的规律,会发现,如果后面的字符代表的数字小于等于前面的数字的话应该是加。相反的话,则是减。这样的话,遍历每一个字符,然后...原创 2019-05-11 20:59:55 · 145 阅读 · 0 评论 -
leetcode【其他】-----20. Valid Parentheses(有效的括号)
1、题目描述2、分析 判断输入的字符串的括号是否有效,这个其实很简单了,在很早之前学习数据结构时应该都见过,这是典型的栈的应用。首先将左括号都入栈,然后在每碰到一个右括号时,判断栈顶元素是否和这个右括号匹配,如果匹配则pop。不匹配则返回false。最后判断栈是否为空,为空则所有括号都匹配,否则还是返回false。3、代码class Solution {pub...原创 2019-05-15 17:50:18 · 67 阅读 · 0 评论 -
leetcode【其他】-----118. Pascal's Triangle(杨辉三角)
1、题目描述2、分析 实现杨辉三角,输入一个n,n为行数,根据杨辉三角的几个特性,杨辉三角以正整数构成,数字左右对称,每行由1开始逐渐变大,然后变小,回到1。第行的数字个数为个第行的第个数字为组合数。第行数字和为。除每行最左侧与最右侧的数字以外,每个数字等于它的左上方与右上方两个数字之和(也就是说,第行第个数字等于第行的第个数字与第个数字的和)。这是因为有组合恒等式:。可用...原创 2019-05-14 17:59:24 · 166 阅读 · 0 评论 -
leetcode【数学】-----326. Power of Three(3的幂)
1、题目描述2、分析 这道题使用循环很容易能得到结果,只需要将这个数不停地除以3,最后判断迭代之后的商是否为1。但是题目中说可以不使用循环,那么就需要一点取巧的办法,题目中输入的是一个int型数据,那么int类型正数范围是0-2^31,这个范围内最大的3的次方数是1162261467,这样我们只需要判断这个数能不能被n整除即可。3、代码class Solutio...原创 2019-05-06 16:20:56 · 113 阅读 · 0 评论 -
leetcode【设计问题】-----384. Shuffle an Array(打乱数组)
1、题目描述2、分析 第一次碰到这种类似于设计一个类的题目,题目要求实现两个函数,reset()函数返回未打乱的数组,shuffle()函数返回一个打乱的数组。那么我们需要一个变量ori_num,保存一开始的原来的顺序的数组,这个变量设置为私有的。构造函数里需要用nums对这个变量进行初始化,初始化的方法可以有很多,可以使用列表初始化、也可以使用拷贝构造函数。这样rese...原创 2019-04-25 17:59:42 · 179 阅读 · 0 评论 -
leetcode【数学】-----204. Count Primes(计数质数)
1、题目描述2、分析 这道题要求求出给定一个n以内的质数的个数,首先最容易想到的方法那肯定是判断每一个数是不是质数,判断质数有一个取巧的地方是,不需要遍历到这个数本身,只需要遍历到这个数的开方就好。如果是则加1。也就是代码中第一种方法。但是还有一种方法是使用埃拉托斯特尼筛法,它的过程是,2开始遍历到根号n,先找到第一个质数2,然后将其所有的倍数全部标记出来,然后到下一个...原创 2019-05-05 19:59:37 · 225 阅读 · 0 评论 -
leetcode【数学】----- 412. Fizz Buzz
1、题目描述2、分析 这道题基本没什么难的,只要分情况讨论即可,需要注意的是分情况时的顺序,如果把15放在最前面可以比较简单的判断出来,如果放在后面则需要增加更多的判断条件。3、代码class Solution {public: vector<string> fizzBuzz(int n) { vector<strin...原创 2019-04-30 00:22:22 · 120 阅读 · 0 评论 -
leetcode【动态规划】-----198. House Robber(打家劫舍)
1、题目描述2、分析 题目意思是给一个数组,从其中提取一系列数据,这些数据任意两个数据不能相邻,让这些数据的和为最大值。一开始理解错题意,以为只要将奇数和偶数的位置上的数字加起来再比较就可以了,但是这样会有一种数组解答错误,比如[4,1,1,4]这样其实最大值是8,但是上面那样计算得到的值5。一般这种求最优值的题目,使用动态规划,动态规划使用一个dp[i]数组来保存到i位...原创 2019-04-24 18:22:41 · 226 阅读 · 0 评论 -
leetcode【树】-----108. Convert Sorted Array to Binary Search Tree(将有序数组转化为二叉树)
1、题目描述2、分析 题目的含义就是将一个从小到大排序的数组变成一个二叉搜索树。二叉搜索树的中序遍历的结果其实就是一个从小到大的排序数组。所以我们反过来思考,首先将数组中间的值作为根节点,之后将数组分为两部分,左半部分插入左子树,右半部分插入右子树,通过递归实现。3、代码/** * Definition for a binary tree node. * st...原创 2019-04-19 19:12:12 · 100 阅读 · 0 评论 -
leetcode【树】-----102. Binary Tree Level Order Traversal(二叉树的层序遍历)
1、题目描述2、分析 二叉树的前中后遍历,通过递归很容易实现。层序遍历一般需要使用队列来实现。首先把根节点放入队列,使用一个变量记录根节点,然后把根节点取出,使用前面记录的变量找到根节点的左右子节点,放入队列,这样队列里就是下一层的节点。用一个for循环遍历,然后存入一个一维数组。遍历完之后把这个一维数组存入二维变量。3、代码/** * Definition ...原创 2019-04-18 20:57:38 · 73 阅读 · 0 评论 -
leetcode【动态规划】-----53. Maximum Subarray(最大子序和)
1、题目描述2、分析 求一个数组中最大子序和,首先应该想到的做法定义两个变量,一个cur,记录当前的子序和,一个res,最终的子序和。先将cur设置为0,res设置为INT_MIN,然后遍历数组,cur等于cur和cur+nums[i]中的大的值,res等于res和cur中大的值,这样最后返回res就是要求的最大值。3、代码class Solution {pu...原创 2019-04-23 17:04:24 · 126 阅读 · 0 评论 -
leetcode【动态规划】-----70. Climbing Stairs(爬楼梯)
1、题目描述2、分析 输入一个n,问爬上n层台阶,有多少种方法,一次可以爬一个或者两个。很明显这其实是一道斐波那契数列的变形,菲波那切数列在我们之前通常作为递归的理解,但是如果输入的数字比较大,递归很容易造成爆栈原因就是递归层次太多。所以在这里我们意识到这个问题是斐波那契之后,一定不要选择递归的做法。而是使用一个变量来保存中间变量,这样其实就是将这个问题,变成了动态规划的...原创 2019-04-22 17:53:31 · 144 阅读 · 0 评论 -
leetcode【设计问题】-----155. Min Stack(最小栈)
1、题目描述2、分析 实现一个栈,这个栈和普通的栈的区别是,它提供一个返回最小值的函数。一开始我以为这道题的栈是需要自己实现的,其实可以不需要,借助STL里面已经有的栈,可以很容易的实现这个,我们只需要设置两个栈,一个按插入顺序保存所有元素,另一个栈在插入的时候比较待插入的元素是不是小于栈顶元素,如果小于再插入,这样第二个栈的栈顶元素始终是最小的那个元素。pop的时候比较...原创 2019-04-26 17:48:18 · 159 阅读 · 0 评论 -
leetcode【其他】-----190. Reverse Bits(颠倒二进制)
1、题目描述2、分析 这道题还是一道和二进制、位操作有关的题,将一个数的二进制颠倒。很容易想到的就是,从最后一位开始取,如果为1则先左移1位然后加1,如果为0,则只左移1位。然后再将原来的数右移一位去掉我们已经取过的位。3、代码class Solution {public: uint32_t reverseBits(uint32_t n) { ...原创 2019-05-12 20:17:33 · 141 阅读 · 0 评论 -
leetcode【DFS】-----111. Minimum Depth of Binary Tree(树的最小深度)
1、题目描述2、分析 求树的最小深度,递归求出左右子树,返回其中小的那个。需要注意的是这里的叶子节点指的是两个子节点都为空的节点,如果只是其中一个子节点为空那么需要返回的是另一个的高。3、代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * ...原创 2019-07-13 11:23:41 · 98 阅读 · 0 评论 -
leetcode【DFS】-----100. Same Tree(相同的树)
1、题目描述 2、分析 这道题算比较简单,判断两个树是否相同,只需要递归左右子树即可。在递归开始进行边界的一些判断。3、代码/**Definition for a binary tree node.struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNo...原创 2019-07-09 20:27:36 · 179 阅读 · 0 评论 -
leetcode【152周赛】-----5174. 健身计划评估
1、题目描述2、分析 这道题其实是一道滑动窗口的应用的题,也就是维护一个大小为K的窗口,计算其中的值,然后再对值进行其他题目需要的计算。滑动窗口的技巧在一些求子串之类的题中很常见。3、代码class Solution {public: int dietPlanPerformance(vector<int>& calories, in...原创 2019-09-02 20:24:51 · 218 阅读 · 0 评论 -
leetcode【152周赛】-----5173. 质数排列
1、题目描述2、分析 很明显首先需要求n以内的质数,求质数有这样一个简单的方法,埃拉托斯特尼筛法,简称埃氏筛或爱氏筛,是一种由希腊数学家埃拉托斯特尼所提出的一种简单检定素数的算法。要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数剔除,剩下的就是素数。这样从2开始,定义一个大小为n的数组,记录每一个数是否被标记,记录过的数则不用判断,这样很容易得到素数的个数...原创 2019-09-01 19:53:36 · 178 阅读 · 0 评论 -
leetcode【DFS】-----200. Number of Islands(岛屿数量)
1、题目描述2、分析 这道题求岛屿数量,岛屿是周围都是水,二维数组中1为岛屿,0为水,并且连着的岛屿算一个。求给定的数组中岛屿的数量。我们可以遍历,在找到一个岛屿的时候,计数加1,把它设为0,对其进行深搜,找其周围是否还存在岛屿,如果存在也将其设置为0,然后再找其余的1进行遍历。3、代码class Solution {public: int num...原创 2019-07-28 21:39:01 · 247 阅读 · 0 评论 -
leetcode【BFS】-----515. Find Largest Value in Each Tree Row(在每个树行中找最大值)
1、题目描述2、分析 这道题其实很简单,就是BFS,层序遍历,然后在这一层中找到最大的值保存下来,然后存入结果。3、代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *rig...原创 2019-07-25 22:33:11 · 133 阅读 · 0 评论 -
leetcode【BFS】-----116. Populating Next Right Pointers in Each Node(填充每个节点的下一个节点)
1、题目描述2、分析 这道题是放在DFS里面的,但是很明显其实用BFS来做会更容易,和树的层序遍历的顺序一样,对每一个节点设置其next指针的位置即可。3、代码/*// Definition for a Node.class Node {public: int val; Node* left; Node* right; ...原创 2019-07-21 21:00:05 · 96 阅读 · 0 评论 -
leetcode【BFS】-----129. Sum Root to Leaf Numbers(求根节点到叶子节点的和)
1、题目描述2、分析 这道题和124题有点像,只不过124更难一点,这道题只需要将所有到叶子节点的值计算出来再计算和。需要注意的是,必须是叶子节点,也就是说递归结束的条件是当前节点的左子树右子树都为空时才结束。之后递归分别计算左子树和右子树即可。3、代码/** * Definition for a binary tree node. * struct T...原创 2019-07-24 21:38:02 · 114 阅读 · 0 评论 -
leetcode【DFS】-----124. Binary Tree Maximum Path Sum(二叉树中的最大路径和)
1、题目描述2、分析 这道题求最大的路径和,从上面的两个例子能看出来这道题需要考虑的点,首先它是需要考虑左右子树的,两个并不分开,其次其实中间的处理部分是一个动态规划的应用,首先定义一个全局变量,取最小值,这个值用来记录最终结果。然后DFS搜索两个子树,并且比较子树的和与0的大小,取其大的,记录两个子树与此时根节点的和,然后再和res比较,取其中大的作为res。需要注...原创 2019-07-24 20:49:50 · 107 阅读 · 0 评论 -
leetcode【BFS】-----117. Populating Next Right Pointers in Each NodeII(填充每个节点的下一个节点)
1、题目描述2、分析 这道题和上一道题很像,都是BFS的应用。3、代码/*// Definition for a Node.class Node {public: int val; Node* left; Node* right; Node* next; Node() {} Node(int _val...原创 2019-07-23 19:57:31 · 84 阅读 · 0 评论 -
leetcode【DFS】-----114. Flatten Binary Tree to Linked List(二叉树展开为链表)
1、题目描述2、分析 首先分析,应该从最底下的节点来开始,所以就是递归应该是从右子树开始,之后再递归左子树。接下来就是需要处理的递归语句,需要处理的就是指针的指向,我们需要用一个变量来保存每次传进来的节点,先将其设为NULL,之后再更改其他指针。3、代码/** * Definition for a binary tree node. * struct Tree...原创 2019-07-14 17:17:36 · 113 阅读 · 0 评论 -
leetcode【DFS】-----113. Path Sum II(路径总和II)
1、题目描述 2、分析 和上一道题很像,只不过需要的是在过程中保存路径,这样就需要一个全局变量来保存最终的结果。一般在涉及到DFS时需要保存结果什么需要全局变量来保存,这样才会保证其在递归的过程中保持原来的值。3、代码/** * Definition for a binary tree node. * struct TreeNode { * ...原创 2019-07-14 16:21:46 · 114 阅读 · 0 评论 -
leetcode【DFS】-----130. Surrounded Regions(被围绕的区域)
1、题目描述2、分析 题的意思是将被包围起来的O变为X。边界上O不算被包围。 本来以为只要把不是边界的O变为X就好,很明显不会那么简单,如果边界上的O相连的非边界的也是O那么这个O也不能变成X。这道题找被包围起来的O比较难找,那就找所有没有被包围起来的O,然后再找所有和边界上的O相邻的非边界O,先将这些O变成#,之后再将所有的O变为X,将所有的#变成O。...原创 2019-07-04 21:12:42 · 162 阅读 · 0 评论 -
leetcode【DFS】-----112. Path Sum(路径总和)
1、题目描述2、分析 DFS边界条件是如果传进来的节点为空,说明前面没找到则返回false,如果左右子节点都为空并且传进来的sum-val等于0,则返回true,递归处理左右子节点就好。3、代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * ...原创 2019-07-13 19:48:21 · 153 阅读 · 0 评论 -
leetcode【DFS】-----110. Balanced Binary Tree(平衡二叉树)
1、题目描述 2、分析 判断平衡二叉树只需要计算其左右子树的高然后相减只要其值小于1即可。只有左右子树都满足时才返回真。3、代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode...原创 2019-07-09 21:13:58 · 130 阅读 · 0 评论 -
leetcode【DFS】-----109. Convert Sorted List to Binary Search Tree(有序链表转为二叉树)
1、题目描述 2、分析 之前做过将一个有序数组转化为二叉树,这道题可以先将链表转化为数组,然后再将数组转化为二叉树,不过这样太过于复杂。因为数组的中点更容易找,但是这里可以通过快慢指针的方法来找到链表的中点,之后和前面构造二叉树的方法一样分为两部分,递归构造。3、代码/** * Definition for singly-linked list. *...原创 2019-07-09 21:02:55 · 138 阅读 · 0 评论 -
leetcode【DFS】-----106. Construct Binary Tree from Inorder and Postorder Traversal(构造二叉树)
1、题目描述 2、分析 和上一道题一样,思路都是找到根节点然后分两半进行递归。3、代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * Tr...原创 2019-07-09 20:46:14 · 101 阅读 · 0 评论 -
leetcode【DFS】-----105. Construct Binary Tree from Preorder and Inorder Traversal【构造二叉树】
1、题目描述 2、分析 从前序和中序中构造二叉树,构造二叉树最关键的是找到根节点,这个题和用后序和中序构造二叉树的思路上是一样的,首先找到根节点,然后将数组再分为两部分,递归的构造左右子树。3、代码/** * Definition for a binary tree node. * struct TreeNode { * int val; ...原创 2019-07-09 20:36:15 · 82 阅读 · 0 评论 -
leetcode【树】-----98. Validate Binary Search Tree(验证二叉搜索树)
1、题目描述2、分析 验证一棵树是不是二叉搜索树,首先要知道二叉搜索树的特性,根节点大于左子节点,小于右子节点。那么根据这个特性,可以写程序,首先将long型数据传入,是方便可以容纳int的边界。其次,递归时,递归左子树的时候,将根节点的值作为左子树的最大值,如果左子树有一个值大于根节点说明不是二叉搜索树。递归右字树时,将根节点的值作为右子树的最小值,如果右子树有一个值小...原创 2019-04-14 20:11:47 · 108 阅读 · 0 评论 -
leetcode【排序与搜索】-----278. First Bad Version(第一个错误版本)
1、题目描述2、分析 题意是尽少调用给出的判断函数,找到第一个出错的版本号。也就是从1到n中找到第一个使给出的判断函数的第一个返回为true的值。首先想到的应该是二分查找,如果返回为true说明第一次出错在左半部分,如果返回为right说明出错在右半部分,然后根据判断情况更改中间结点的值。3、代码// Forward declaration of isBadVe...原创 2019-04-21 16:46:04 · 126 阅读 · 0 评论 -
leetcode【数组】-----189.Rotate Array(旋转数组)
1、题目描述2、分析 给定一个数组,将数组中的元素向右移动k个位置,其中k是非负数。 这道题最容易想到的是复制一个一样的数组,然后根据需要移动的位置更改原数组的值。但是这样的空间复杂度是O(n)。所以我们需要想别的办法,有一个很巧妙的办法就是,使用STL里面的push_back()和erase()函数,将数组的第一个数插入到数组的最后,再将第一个...原创 2019-03-13 16:42:45 · 219 阅读 · 0 评论 -
leetcode【数组】-----283. Move Zeroes(移动0)
1、题目描述2、分析 给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。 数组的题还是首先想到双指针。另外如果题目要求在原数组上做修改那么意味着不能使用别的空间,这时候一般使用swap交换元素或者使用一个中间变量记录然后再赋值。这道题先将两个指针指向第一个元素,然后使用一个指针向后遍历找不为0的元素,找到以后让...原创 2019-03-18 16:54:32 · 114 阅读 · 0 评论