03 2020 档案
摘要:一:解题思路 这道题目和之前的单身数字的题目有点像。那个题目是每个数子都出现2次然后找到只出现1次的那个数字。那个题目的核心是异或的思想。类比过来这道题目 二:完整代码示例 (C++版和Java版) 方法一:Time:O(n),Space:O(1) 方法一比方法二容易理解 方法二:Time:O(n)
阅读全文
摘要:一:解题思路 之前做了一道单数数字的题目,是每个数字出现了2次,只有一个数字只出现1次。你要找到那个只出现1次的数字。那么这道题目是否可以采用那道题目比较高效的解法呢?之前那道题目比较高效的解法是异或。当然,这道题目可以借鉴里面的思想在里面。可以把这个两个单身数字分别放在两组里面,然后每组进行累加异
阅读全文
摘要:问题一: (1)一个类只有包含虚函数才会存在虚函数表,同属于一个类的对象共享虚函数表,但是有各自的vptr(虚函数表指针),当然所指向的虚函数表是同一个。 (2)父类中有虚函数就等于子类中有虚函数。只要父类中有虚函数,子类中即便不写virtual,也依旧是虚函数。 (3)不管是父类还是子类,都会只有
阅读全文
摘要:问题1:何时必须使用成员初始化列表?有以下几种情况 1.如果这个成员是个引用。2.如果这个成员是个const类型成员。3.如果这个类是继承一个基类,并且基类中有构造函数,这个构造函数里边还有参数。4.如果成员变量类型是个某个类类型,而这个类的构造函数带参数。 问题2:使用初始化列表的优势 1.除了必
阅读全文
摘要:传统大家认为,如果我们在类中没有定义一个自己的拷贝构造函数,编译器会帮助我们合成一个拷贝构造函数,这个合成的拷贝构造函数也是在必要的时候才合成,那么这个必要的时候是什么时候呢?让我们来一起研究。 先来看一个简单的例子: #include <iostream> using namespace std;
阅读全文
摘要:问题:传统认识为:如果我们自己在类中没有定义任何构造函数,那么编译器就会为我们隐式自动生成一个默认的构造函数,我们称这种构造函数为“合成的默认构造函数”。事实的真相果真如此吗? 结论:“合成默认构造函数”,只有在必要的时候,编译器才会为我们自动合成出来,而不是必然为我们合成出来。那到底什么时候是必要
阅读全文
摘要:一:解题思路 使用2个游标p,q分别指向位置1,当q和q-1所指向的元素相同的时候,q++,如果不等的时候,那么nums[p++]=nums[q++]; Time:O(n),Space:O(1) 二:完整代码示例 (C++版和Java版) C++: class Solution { public:
阅读全文
摘要:一:解题思路 Time:O(k*n),Spaec:O(1) 二:完整代码示例 (C++版和Java版) C++: class Solution { public: string longestCommonPrefix(vector<string>& strs) { if (strs.size() =
阅读全文
摘要:一:解题思路 解析:在C++和Java中,-3%10=-3。在Python中,-3%10=7。 方法一:采用一个长整型y来保存结果,每次迭代过程为 y=y*10+x%10。 方法二:如果系统中不允许使用long型,这个时候则需要就要采用方法二。 二:完整代码示例 (C++版和Java版) 第一种方法
阅读全文
摘要:一:解题思路 分析:这个题目的本质其实就是要求最长路径,当最长路径求出来了,二叉树的直径就知道了。如果所要求的最长路径要经过根节点,那么我们可以递归的去求各个子树的最长路径。但是最长路径并不一定包含根节点,所以,我们可以把所有的路径给穷举出来,然后进行比较得出最大值就行。如果采用自顶向下的方式来求解
阅读全文
摘要:一:解题思路 方法一:不断的寻找股票的最小值和最大值,并在最小值得时候买入,在最大值得时候卖出。Time:O(n),Space:O(1) 方法二:贪心法,只要后一天的值大于前一天的值,那么就进行买卖。Time:O(n),Space:O(1) 两种方法的时间和空间复杂度都是一样的。 二:完整代码示例
阅读全文
摘要:一:解题思路 方法一:递归法:Time:O(n),Space:O(n) 方法二:迭代法:Time:O(n),Space:O(n) 二:完整代码示例 (C++版和Java版) 递归C++: class Solution { public: int dfs(TreeNode* root, int sum
阅读全文
摘要:一:解题思路 从根节点到当前节点p的经过的路径节点记录下来到ppath数组中,从根节点到当前的节点q的经过的节点记录下来到qpath中,对比这2个数组中最后相同的那个节点,并且将其返回即可。Time:O(n),Space:O(n) 二:完整代码示例 (C++版和Java版) C++: class S
阅读全文
摘要:一:解题思路 方法一:递归法,当p和q的值,都小于当前根节点上的值得时候,就递归到左子树上来。当p和q的值,都大于当前根节点上的值得时候,就递归到右子树上来。否者,如果不满足上述2种情况,这当前的根节点就是所求的节点。Time:O(h),Space:O(h) 方法二:迭代法。Time:O(h),Sp
阅读全文
摘要:一:解题思路 方法一:Time:O(n),Sapce:O(n) 方法二:Time:O(n),Sapce:O(1) 二:完整代码示例 (C++版和Java版) 方法一C++: class Solution { public: vector<int> findDisappearedNumbers(vec
阅读全文
摘要:一:解题思路 方法一:先遍历一遍字符串,记录每个字母出现的次数,然后再遍历一遍字符串,查看第一次出现只出现一次的字母下标。这种方法需要遍历字符串2次,如果字符串很长的话,那么就会比较耗时。Time:O(n),Space:O(n) 方法二:遍历一遍字符串,记录每个字母出现的次数,同时记录每个字母出现的
阅读全文
摘要:一:解题思路 将要删除节点的后面节点的值赋值给待删除的节点,然后再将要删除节点的next指针指向后后的一个节点。Time:O(1),Space:O(1) 二:完整代码示例 (C++版和Java版) C++: class Solution { public: void deleteNode(ListN
阅读全文
摘要:一:解题思路 解题方法:用2个栈实现队列 二:完整代码示例 (C++、Java、Python) C++: class MyQueue { public: /** Initialize your data structure here. */ stack<int> m_in; stack<int> m
阅读全文
摘要:一:解题思路 方法一:将s中的每一颗子树都和t进行对比。Time:O(m*n),Space:O(h) 方法二:将s和t的每颗子树的根节点都设置一个哈希值,于是只需要对比对于节点的哈希值就行。Time:O(m+n),Space:O(m+n) 二:完整代码示例 (C++版和Java版) 方法一C++:
阅读全文
摘要:一:解题思路 方法一:递归法,Time:O(2^n),Space:O(n) 方法二:迭代法一:Time:O(n),Space:O(n) 方法三:迭代法二:Time:O(n),Space:O(1) 二:完整代码示例 (C++版和Java版) 方法一C++: class Solution { publi
阅读全文
摘要:一:解题思路 第一种方法:暴力破解法:Time:O(m*n),Space:O(1) 第二种方法:利用一个哈希表,Time:O(m+n),Space:O(k) 二:完整代码示例 (C++版和Java版) 第一种方法C++: class Solution { public: int numJewelsI
阅读全文
摘要:一:解题思路 第一种方法:新申请一个和原始数组一样大的新数组。先把要反转的数字拷贝到新数组中,然后把剩余的数字也拷贝到新数组中。最后把这个新数组全部拷贝到原始数组中来。Time:O(n),Space:O(n) 第二种方法:首先将整个数组反转,然后将旋转部分反转,最后将剩余部分反转。Time:O(n)
阅读全文
摘要:一:解题思路 方法一:先计算出链表的长度,然后用一个指针指向链表的首结点,让这个指针走链表一般的长度,最后就落在链表的中间位置。 方法二:快慢指针法,先让快指针和慢指针都分别指向链表首节点,快指针每次走两步,慢指针每次走一步,当快指针指向为空时,此时慢指针就指向中间节点。 二:完整代码示例 (C++
阅读全文
摘要:一:解题思路 这道题目是反转字符串的变形题目。我们只需要将每个单词作为一个单独的字符串进行反转即可。 二:完整代码示例 (C++版和Java版) C++: Time:O(n),Space:O(1),因为C++语言能够直接修改源字符串,所以不需要申请一个额外的数组空间出来。 class Solutio
阅读全文
摘要:一:解题思路 Time:O(n),Space:O(n) 二:完整代码示例 (C++版和Java版) C++: class Solution { public: TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) { if (t1 == NULL && t
阅读全文
摘要:一:解题思路 Time:O(n),Space:O(1) 二:完整代码示例 (C++版和Java版) C++: class Solution { public: void reverseString(vector<char>& s) { int i = 0, j = s.size() - 1; for
阅读全文
摘要:一:解题思路 方法一:Time:O(n),Space:O(n) 方法二:Time:O(n),Space:O(1) 二:完整代码示例 (C、C++、Java、Python) 方法一C: void moveZeroes(int* nums, int numsSize) { if (numsSize ==
阅读全文
摘要:一:解题思路 这是一道动态规划题 方法一:状态d(i)表示爬到第i阶楼梯时的最小代价,d(i)=min(d(i-1),d(i-2))+c(i),初始条件,d(0)=c(0),d(1)=c(1)。最后爬到第n阶楼梯的时候,是可以由倒数第一阶楼梯爬上去的,也可以从倒数第二阶楼梯爬上去的。故最后要返回的是
阅读全文
摘要:一:解题思路 Time:O(n),Space:O(1) 二:完整代码示例 (C++版和Java版) C++: class Solution { public: ListNode* deleteDuplicates(ListNode* head) { if((head==NULL)||(head->n
阅读全文
摘要:一:解题思路 这道题是一道动态规划题。动态规划核心在于定义状态和状态转移方程。那么怎样定义呢? 定义d(i)抢劫有i个房子的最大金额。那么d(i)=max(d(i-1),d(i-2)+nums[i]),d(0)=nums[0],d(1)=max(nums[0],nums[1]) 第一种方法:需要一个
阅读全文
摘要:一:解题思路 解题方法:遍历一遍原始字符串,统计每个字母出现的次数,并统计有多少个奇数的字母。那么最后用不上的字母个数为奇数字母个数减1,最后减去它和0之间的最大值即可。Time:O(n),Space:O(k) 二:完整代码示例 (C++版和Java版) C++: class Solution {
阅读全文
摘要:一:解题思路 方法一:递归法 Time:O(n),Space:O(log(n)) 方法二:迭代法 Time:O(n),Space:O(n) 二:完整代码示例 (C++版和Java版) C++递归: class Solution { public: TreeNode* sortedArrayToBST
阅读全文
摘要:一:解题思路 第一种方法:递归法,Time:O(h),Space:O(h),h为二分搜索树的高度 第二种方法:迭代法:Time:O(h),Space:O(1),h为二分搜索树的高度 二:完整代码示例 (C++版和Java版) 递归C++: class Solution { public: TreeN
阅读全文
摘要:一:解题思路 这个题目关键要找出规律,并用数学表达式表示其中的规律。 i:0->n-1 a(i,0)=1;a(i,i)=1;a(i,j)=a(i-1,j-1)+a(i-1,j)。Time:O(n),Space:O(1) 二:完整代码示例 (C++版和Java版) C++: class Solutio
阅读全文
摘要:一:解题思路 第一种方法:递归法 第二种方法:迭代法 ,2种方法的 Time:O(n),Space:O(n) 二:完整代码示例 (C++版和Java版) 递归C++: class Solution { public: bool hasPathSum(TreeNode* root, int sum)
阅读全文
摘要:一:解题思路 这个题目的解法为:先将2个数进行异或,然后求出异或结果中有多少个1即可。 二:完整代码示例 (C++版和Java版) C++: class Solution { public: int numberofOne(int x) { int count = 0; while (x != 0)
阅读全文
摘要:一:解题思路 第一种方法:利用二分搜索的思想来做。 第二种方法:利用牛顿迭代法来做。两种方法的时间复杂度都为O(log(n)),空间复杂度为:O(1) 二:完整代码示例 (C++版和Java版) 二分搜索C++: class Solution { public: int mySqrt(int x)
阅读全文
摘要:一:解题思路 第一种方法:用一个数字1与原始数字进行按位&,如果不为0,计数器加1,然后数字1向左移动一位,继续检查原始数字的倒数第二位,直到数字1向左移动变为0。Time:O(m),m表示原始数字中二进制1的个数。Space:O(1) 第一种方法变体:判断(n&1) ==1 ? counts+=1
阅读全文
摘要:一:解题思路 这道题目是常规的链表删除的题目,为了使链表的第一个元素和链表的其他元素处理具有相同的方式,创建一各虚拟的节点,让这个虚拟的头节点的next指针指向链表的首节点。Time:O(n),Space:O(1) 二:完整代码示例 (C++版和Java版) C++: class Solution
阅读全文
摘要:一:解题思路 这个题目有2种解法。第一种为暴力破解法,求出所有可能的情况,然后得到最大值。Time:O(n^2)。Space:O(1) 第二种方法,采用动态规划的思想。Time:O(n),Space:O(1) 二:完整代码示例 (C++版和Java版) 第一种方法C++: class Solutio
阅读全文
摘要:一:解题思路 这道题目有2种方法,第一种是递归法,第二种是迭代法。2种方法的时间和空间复杂度都为O(n)。 二:完整代码示例 (C++ & Java & python) python递归版: class Solution: def postorderTraversal(self, root: Tre
阅读全文
摘要:一:解题思路 这道题目有2种解法,第一种是递归法,第二种是迭代法。他们的时间复杂度和空间复杂度都为O(n)。 二:完整代码示例 (C++版和Java版) 递归法C++: class Solution { public: void inorder(TreeNode* root, vector<int>
阅读全文
摘要:一:解题思路 这道题目2种做法。第一种做法就是递归法,第二种就是迭代法。这2种方法的时间复杂度和空间复杂度都为O(n)。 二:完整代码示例 (C++版和Java版) 递归C++: class Solution { public: void preorder(TreeNode* root, vecto
阅读全文
摘要:一:解题思路 这道题目是二叉树层序遍历的变体,只需要在二叉树层序遍历的结果上,将结果沿中轴线对调一下就行。Time:O(n),Space:O(n) 二:完整代码示例 (C++版和Java版) C++: //Time:O(n),Space:O(n) class Solution { public: v
阅读全文
摘要:一:解题思路 Time:O(n),Space:O(n) 二:完整代码示例 (C++版和Java版) C++: class Solution { public: vector<vector<int>> levelOrder(TreeNode* root) { vector<vector<int>> r
阅读全文
摘要:一:解题思路 利用一个辅助栈,当遇到左符号时候,入栈。当遇到右符号时候,与栈顶元素相比是否相等,按照这样的方式将字符串遍历循环下去,看看最后栈是否为空。 Time:O(n),Space:O(n) 二:完整代码示例 (C++、Java、Python) C++ //Time:O(n),Space:O(n
阅读全文
摘要:一:解题思路 这道题有2种解题方法。 第一种就是递归法,从根节点开始,自定向下开始遍历二叉树,这样对树中的节点就会有很多重复遍历的,导致算法的时间复杂度不高。算法时间复杂度为n*log(n),当树只有一边的时候,递归调用深度为最深。算法的空间复杂度为:O(n)。 第二种方法在于改进第一种方法,第一种
阅读全文
摘要:一:解题思路 这道题目有2种做法。 解法一:利用递归的方法来做。 解法二:利用一个辅助队列,用迭代的方法来做。2种方法的时间复杂度,和空间复杂度都为:O(n) 二:完整代码示例 (C++版和Java版) 递归版C++: class Solution { public: TreeNode* inver
阅读全文
摘要:一:解题思路 这个题目第一种解题方法是朴素解法,时间复杂度为O(n*m)。 第二种方法就是KMP算法,用KMP算法可以将时间降低为O(m+n)。 二:完整代码示例 (C++版和Java版) 朴素解法C++: class Solution { public: int strStr(string hay
阅读全文
摘要:一:解题思路 丑数的定义为:只包含质因数为2,3,5的正整数,其中1作为特例也算作丑数。这个题目比较简单,首先需要判断这个数是否小于等于0,如果是肯定不是丑数,然后需要连续的去除以2,3,5,看最后的得到的结果是否为1。如果最后得到的结果是为1这说明这个数为丑数。 Time:O(m+n+l),Spa
阅读全文
摘要:一:解题思路 这个题目是二分搜索的变形题目,与标准的二分搜索只有一点有区别,如果没有找到返回begin即可。Time:O(log(n)),Space:O(1) 二:完整代码示例 (C++版和Java版) C: int searchInsert(int* nums, int numsSize, int
阅读全文
摘要:一:解题思路 这道题目是一道原始的二分搜索问题,比较简答。在写代码的时候,需要注意几个细节问题就行。Time:O(log(n)),Space:O(1) 二:完整代码示例 (C++版和Java版) C++: class Solution { public: int search(vector<int>
阅读全文
摘要:一:解题思路 这道题目是一道简单的动态规划题目。 第一种方法为递归法。Time:O(2^n),Space:O(n) 第二种方法利用一个数组:Time:O(n),Space:O(n) 第三种方法为迭代法。Time:O(n),Space:O(1) 二:完整代码示例 (C、C++、Java、Python)
阅读全文
摘要:一:解题思路 两种方法的Time:O(m+n),Space:O(1) 二:完整代码示例 (C++版和Java版) 第一种方法C++ class Solution { public: ListNode *getIntersectionNode(ListNode *headA, ListNode *he
阅读全文
摘要:一:解题思路 这道题目有2种解题方法。 第一种:循环遍历单链表中的每个节点,将每个节点加入一个集合set中去,如果遍历的节点在集合set中出现过,这说明这个单链表一定有环。Time:O(n),Space:O(n) 第二种:用快慢指针法来解决这个问题。定义快指针和慢指针都指向链表的头部,快指针每次走2
阅读全文
摘要:一:解题思路 这道题目,有2种方法可以解决。第一种方法:循环遍历一遍数组,利用一个哈希表记录每个数字出现的次数,然后返回次数最多的那个数字。这个方法遍历了一遍数组时间复杂度为:O(n),用了一个哈希表,空间复杂度为:O(n)。 第二种方法:利用摩尔投票法。Time:O(n),Space:O(1) 二
阅读全文
摘要:一:解题思路 这道题用动态规划的思想来做,可以将时间复杂度降低为Time:O(n),空间复杂度为:O(1) 二:完整代码示例 (C++版和Java版) C++版: class Solution { public: int max(int a, int b) { return a>b?a:b; } i
阅读全文
摘要:一:解题思路 这个题目的解法利用双指针来进行解答。 二:完整代码示例 (C++版和Java版) C++版: class Solution { public: void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) { int
阅读全文
摘要:一:解题思路 这道题可以用2种方法来做。第一种是递归法,第二种是迭代法。 二:完整代码示例 (C++版和Java版) 递归法C++: class Solution { public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { List
阅读全文
摘要:一:解题思路 这道题可以用递归法和迭代法来解决。 二:完整代码示例 (C++版和Java版) 递归法C++: class Solution { public: int max(int a, int b) { return a > b ? a : b; } int maxDepth(TreeNode*
阅读全文
摘要:一:解题思路 方法一:递归法。 方法二:迭代法,利用二叉树的层级遍历的思想,找到与根节点最近的叶子节点,这个时候就知道二叉树的最小深度了。 二:完整代码示例 (C++版和Java版) 递归版C++: //Time:O(n),Space:O(n)class Solution { public: int
阅读全文
摘要:一:解题思路 我们知道2个相同的数字异或的结果为0,所以我们只需要将数组下标和数组中每个元素相异或就能够找出最后的那个缺失的数字。 二:完整代码示例 (C++版和Java版) Time:O(n),Space:O(1) C++版: class Solution { public: int missin
阅读全文
摘要:一:解题思路 这道题主要有2种解题方法。第一种:利用一个辅助栈,在遍历链表的时候,将链表中所对应的元素相应的入栈,然后在相应的对比栈顶元素和链表的元素。这种方法遍历了2遍单链表,空间上用了一个栈。所以,Time:O(n),Space:O(n) 第二种方法:将单链表翻转一半,然后分别向2边进行对比。所
阅读全文
摘要:一:解题思路 二:完整代码示例 (C++版和Java版) 第一种方法C++ //Time:O(m),Space:O(1) class Solution { public: bool isPalindrome(int x) { string str = to_string(x);//C++11特有语法
阅读全文
摘要:一:解题思路 这道题目回溯的思想来做,代码表现的方式为递归。Time:O(n*n!),Space:O(n) 二:完整代码示例 C++版: class Solution { public: void permuteRec(vector<int>& nums, int start, vector<vec
阅读全文
摘要:一:解题思路 第一种方法:这个题目首先可以想到的用一个循环,将x连续乘以n次,如果n小于0,则返回其倒数,如果n大于0,则直接返回其结果。Time:O(n),Space:O(1) 第二种方法:要用到二分搜索的思想在里面。Time:O(log(n)),Space:O(1) 二:完整代码示例 (C++版
阅读全文
摘要:一:解题思路 方法一:用递归的方法去解决。Time:O(n),Space:O(n) 方法二:用双指针的方法去解决。Time:O(n),Space:O(1) 二:完整代码示例 (C++、Java、Python) 方法一C++: class Solution { public: ListNode* re
阅读全文
摘要:一:解题思路 这道题目与判断二叉树是否相等基本上是一模一样的。有2种解法,第一种:递归法。第二种:迭代法。 二:完整代码示例 (C++版和Java版) 递归版C++: class Solution { public: bool isSymmetricRecursive(TreeNode* left,
阅读全文
摘要:一:解题思路 因为树是递归定义的,所以与二叉树的相关操作都可以用递归的方法来解决。用递归的方法来解决,从本质上看也就可以用迭代的方法来解决。这道题目与之前博客的p4(判断二叉树是否对称)几乎是一模一样的。这道题的难度在于,用迭代法求解这个题目,用一个栈来存储树节点。 二:完整代码示例 (C++版和J
阅读全文
摘要:一:解题思路 这个题目的解题的关键在于抓住二维矩阵的规律,从左向右是递增的,从上到下是递增的。得到二维数组的行数(i)和列数(j)。1.将坐标定位到二维数组的右上角,如果目标值target小于此时的二维数组的元素,说明此时二维数组所对应的一整列都大于目标值,此时 j--。2.如果目标值target大
阅读全文
摘要:一:解题思路 这道题目介绍2种方法。 解法一:利用位运算来做,数组中所有的数字都是成对出现的,只有一个是单独出现的,那么我们可以利用异或的性质来做。Time:O(n),Space:O(1) 解法二:利用集合set的特性,把所有数字添加到集合中(每个数字只出现一次),然后将集合中的数字乘以2减去原来数
阅读全文
摘要:一:解题思路 对于这样的题目,不能使用加(+)、减(-),从而求两数之和。连最基本的+,-都不能用,那么肯定就要想到位运算了。找到里面的规律,进而总结出一般性的结论出来。比如,来举个例子,9+11 在二进制的层面来进行运算,为什么要用9和11两个数呢?因为他们包含了相加的多种情况在里面。 二:完整代
阅读全文
摘要:一:解题思路 方法一:暴力破解法,Time:O(n^2),Space:O(1) 方法二:利用一个哈希表,Time:O(n),Space:O(n) 方法三:利用二分的思想。Time:O(log(n)),Space:O(1) 二:完整代码示例 (C、C++、Java、Python) 方法一C: int*
阅读全文
摘要:一:解题思路 方法一:暴力法。Time:O(n^2),Space:O(1) 方法二:利用一个哈希表来保存另外一个数字以及数字出现的下标。Time:O(n),Space:O(n) 二:完整代码示例 (C,C++、Java、python) 方法一C: int* twoSum(int* nums, int
阅读全文
摘要:一:解题思路 Time:O(n),Space:O(1) 二:完整代码示例 (C、C++、Java、Python)方法一C: bool isNumberOrCharacter(char c) { return (c>='A' && c<='Z') || (c>='a' && c<='z') || (c
阅读全文

浙公网安备 33010602011771号