11 2020 档案
摘要:在Visio 2013中,您可以使用控制点(黄点)更改类宽度,只需拖动它:
阅读全文
摘要:思路 方法一:递归 以下代码改成c++中string的写法,提交到C++中会超时,可能string比指针更慢吧。 以下C语言代码参考《剑指offer(第2版)》书中的代码,可以在leetcode中提交通过。 这种递归方法效率比较低下。 1 bool matchCore(const char* str
阅读全文
摘要:思路 转载自: 面试题68 - II. 二叉树的最近公共祖先(后序遍历 DFS ,清晰图解) 方法:后序遍历 (自底向上)
阅读全文
摘要:思路 方法一:迭代 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x)
阅读全文
摘要:思路 方法:模拟 本题难点在于怎么判断数字是否超过int的范围,这里有两个方法解决: (1) 使用long long直接判断 1 class Solution { 2 public: 3 int strToInt(string str) { 4 if(str.empty()) 5 return 0;
阅读全文
摘要:思路 方法:对称遍历 1 class Solution { 2 public: 3 vector<int> constructArr(vector<int>& a) { 4 if(a.empty()) 5 return vector<int>(); 6 7 vector<int> b(a.size(
阅读全文
摘要:思路 方法:使用位运算实现二进制加法 Java实现 1 class Solution { 2 public int add(int a, int b) { 3 int sum, carry; 4 while(b != 0) //运算到没进位为止 5 { 6 sum = a ^ b; // 用异或运算
阅读全文
摘要:思路 方法:使用逻辑&&运算符的短路特性终止递归 1 class Solution { 2 public: 3 int sumNums(int n) { 4 n > 1 && (n += sumNums(n - 1)); 5 return n; 6 } 7 };
阅读全文
摘要:思路 方法一:暴力法 1 class Solution { 2 public: 3 int maxProfit(vector<int>& prices) { 4 int n = (int)prices.size(), ans = 0; 5 for (int i = 0; i < n; ++i){ 6
阅读全文
摘要:思路 这是经典的约瑟夫环问题。 方法一:用链表模拟 用链表模拟整个游戏过程。如果单纯用链表模拟的话,每次需要从1数到m,才能踢除1个数,所以踢除n-1个数一共需要遍历(n-1)*m次,时间复杂度就是O(n*m),这种方法会超时。 方法二:数学递推公式 1 class Solution { 2 pub
阅读全文
摘要:思路 1. 先排序 2. 如果最大值-最小值>=5,返回false 3. 如果有重复数字,返回false 1 class Solution { 2 public: 3 bool isStraight(vector<int>& nums) { 4 //先排序 5 sort(nums.begin(),
阅读全文
摘要:思路 方法:动态规划 用dp[i][j]表示掷完 i 个骰子之后其点数之和为 j 的总次数,这可以由 投掷完 n-1 枚骰子后,对应点数 j-1, j-2, j-3, ... , j-6 出现的次数之和转化过来。 即: 1 class Solution { 2 public: 3 vector<do
阅读全文
摘要:思路 方法:维护一个单调的双端队列 1 class MaxQueue { 2 private: 3 queue<int> A; 4 deque<int> B; 5 public: 6 MaxQueue() { 7 8 } 9 10 int max_value() { 11 if(B.empty())
阅读全文
摘要:思路 方法一:暴力法 遍历每一个数nums[i],之后在[i, i+k]中顺序寻找最大值。 时间复杂度:O(k*n) 1 class Solution { 2 public: 3 vector<int> maxSlidingWindow(vector<int>& nums, int k) { 4 i
阅读全文
摘要:思路 方法一:库函数rotate() 1 class Solution { 2 public: 3 string reverseLeftWords(string s, int n) { 4 rotate(s.begin(), s.begin()+n, s.end()); 5 return s; 6
阅读全文
摘要:思路 方法一:分割 + 倒序 时间复杂度:O(n),n为s的长度。 1 class Solution { 2 public: 3 string reverseWords(string s) { 4 string t = ""; 5 stack<string> strStack; 6 for(int
阅读全文
摘要:思路 方法一:枚举 + 暴力 1 class Solution { 2 public: 3 vector<vector<int>> findContinuousSequence(int target) { 4 vector<vector<int>> res; 5 for(int i = 1; i <
阅读全文
摘要:思路 方法一:二分 遍历每个数字num,然后再在后面的数字中使用二分查找target-num。 复杂度分析 时间复杂度:O(nlogn) 空间复杂度:O(1) 1 class Solution { 2 public: 3 vector<int> twoSum(vector<int>& nums, i
阅读全文
摘要:思路 方法:位运算 遍历统计 1 class Solution { 2 private: 3 int cnt[32] = {0}; 4 public: 5 int singleNumber(vector<int>& nums) { 6 for(int num: nums) { 7 for(int i
阅读全文
摘要:思路 方法:分组异或 1 class Solution { 2 public: 3 vector<int> singleNumbers(vector<int>& nums) { 4 int res = 0; 5 for(int &num: nums) { 6 res ^= num; 7 } 8 9
阅读全文
摘要:思路 方法一:暴力递归法 (自顶向下的递归) 使用递归编写一个求高度的函数,之后使用先序遍历每个结点,判断左右子树的高度差是否满足要求。 这种方法每次判断一个结点都需要使用递归先求出其左右子树的高度,比如下面这棵树,判断1的时候,使用递归求了2,3, 4的高度,判断2的时候,又递归求了3,4,的高度
阅读全文
摘要:思路 方法:递归 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x)
阅读全文
摘要:思路 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(
阅读全文
摘要:思路 方法一:顺序查找 顺序查找第一个nums[i]不等于下标 i 的数,这时的下标 i 就是缺少的数。 复杂度分析 时间复杂度:O(n) 空间复杂度:O(1) 方法二:二分法 复杂度分析 时间复杂度:O(logn) 空间复杂度:O(1) 1 class Solution { 2 public: 3
阅读全文
摘要:思路 排序数组中的搜索问题,首先想到 二分法 解决。 方法一:二分法之一 (类似暴力) (1) 用二分法找到其中一个target所在的位置 (2) 之后在此位置前后顺序查找依次计数target的出现次数。(有点暴力,在方法二对此有改进) 复杂度分析 时间复杂度:最坏情况下O(n) 空间复杂度:O(1
阅读全文
摘要:思路 方法一:暴力法 方法二:哈希表 方法三:双指针之一 (1) 遍历链表A, B,计算出他们分别的长度lenA, lenB。 (2) 链表长的指针向后移动到俩个链表长度差的位置。 (3) 之后一一进行比较。 复杂度分析 时间复杂度:O(lenA + lenB) 空间复杂度:O(1) 1 /** 2
阅读全文
摘要:关于单链表中的环,一般涉及到以下问题: 1.给一个单链表,判断其中是否有环的存在; 使用快慢指针,每次快指针比慢指针多走一步,即慢指针每次走一步,快指针每次走两步,直到快指针又追到慢指针,说明存在环,并且快指针一定会在慢指针走完第一圈之前和它相遇。时间复杂度为线性。 2.如果存在环,找出环的入口点;
阅读全文
摘要:思路 方法:归并排序求逆序对 题解思路来自:力扣官方题解 - 数组中的逆序对 复杂度分析 1 class Solution { 2 public: 3 int reversePairs(vector<int>& nums) { 4 vector<int> tmp(nums.size()); 5 re
阅读全文
摘要:思路 方法:哈希表 第一次遍历字符串s,用哈希表统计每个字符出现的次数,第二次遍历字符串s,当某字符出现次数为1时,返回之。 复杂度分析 时间复杂度:O(n)。 空间复杂度:O(1)。由于题目指出 s 只包含小写字母,因此最多有 26 个不同字符,最多需占用 O(26) = O(1) 的额外空间。
阅读全文
摘要:思路 方法一:小顶堆 生成丑数的规律:如果已知丑数ugly,那么ugly * 2,ugly * 3和ugly * 5也都是丑数。既然求第n小的丑数,可以采用最小堆来解决。每次弹出堆中最小的丑数,然后检查它分别乘以2、3和 5后的数是否生成过,如果是第一次生成,那么就放入堆中。第n个弹出的数即为第n小
阅读全文
摘要:思路 方法一:暴力法 对于字符串s,用f[i]表示以s[i]开头的无重复字符的字符串最大长度, 逐一求出f[0], f[1], ... ,f[s.length()-1] ,最后返回这些值中的最大值即可。 1 class Solution { 2 public: 3 int lengthOfLonge
阅读全文
摘要:思路 方法:动态规划 比较明显的动态规划问题。设f[i][j]表示从(0,0)走到(i, j)获取的最大价值。 状态转移方程为:f(x, y) = grid(x,y) + max {f(x-1,y), f(x, y-1)} 。 空间优化:这里不使用额外的数组f,而就地更改grid数组,可以将空间复杂
阅读全文
摘要:思路 方法一:暴力法 使用深度优先搜索枚举出全部情况,试探每一种可能性。 1 class Solution { 2 public: 3 int translateNum(int num) { 4 string s = to_string(num); 5 int res = 0; 6 dfs(s, r
阅读全文
摘要:本文转载自:https://blog.csdn.net/u011947630/article/details/104691611 选择排序、冒泡排序等算法的时间复杂度都比较好理解,但不是很清楚快速排序的时间复杂度为什么是O(nlogn)。从《算法图解》中看到的思路,很赞,解决了一直以来的疑惑。 引用
阅读全文
摘要:思路 本题解来自:面试题45. 把数组排成最小的数(自定义排序,清晰图解) 方法:自定义排序 1 class Solution { 2 public: 3 string minNumber(vector<int>& nums) { 4 vector<string> vs; 5 for(int i =
阅读全文
摘要:思路 本题解来自:面试题44. 数字序列中某一位的数字(迭代 + 求整 / 求余,清晰图解) 方法:找规律 1 class Solution { 2 public: 3 int findNthDigit(int n) { 4 int digit = 1; 5 long long start = 1;
阅读全文
摘要:思路 这题如果直接用暴力法,1~n逐一判断,每个数逐位判断需要O(L)的时间,其中L为n的位数,所以总的时间复杂度为O(L*n),这显然会超时。 方法:逐位判断,找规律 假设n是4位数abcd, 即n=abcd,从右往左逐位分析: - 对于n中的第4位数d: - 如果d ≥ 1,对于1~n中第4位数
阅读全文
摘要:思路 方法一:简单排序 将数字存储在可调整大小的容器中。每次需要输出中间值时,对容器进行排序并输出中间值。 复杂度分析 时间复杂度:O(nlogn)+O(1)≃O(nlogn)。 添加一个数字对于一个有效调整大小方案的容器来说需要花费 O(1) 的时间。找到中间值主要取决于发生的排序。对于标准比较排
阅读全文
摘要:思路 方法一:动态规划 1 class Solution { 2 public: 3 int maxSubArray(vector<int>& nums) { 4 //memo[i]表示以nums[i]结尾并且包含nums[i]的子数组的最大和 5 vector<int> memo(nums.siz
阅读全文
摘要:组合数C(n,m)的大小有以下两种计算方法: (1) 直接用定义求,时间复杂度:O(m) int combi(int n, int m){ //求组合数的函数 int res = 1; for(int i = 0; i < m; ++i) { res *= n - i; res /= i + 1;
阅读全文
摘要:思路 贪心思想,先对小孩的胃口和饼干的尺寸进行从小到大排序,每次选出能满足该小孩的最小饼干。 1 class Solution { 2 public: 3 int findContentChildren(vector<int>& g, vector<int>& s) { 4 // 先对小孩和饼干从小
阅读全文
摘要:思路 贪心算法 因为区间的右边界end越小,可以给后面留到的空间就越大。所以按照区间的右边界从小到大进行排序,每次都选右边界最小并且左边界大于前一个区间右边界的区间,最后可以累加得到最大不重叠区间的个数m,最后用总区间个数-m即为要删去的最小区间数。 1 class Solution { 2 pri
阅读全文
摘要:第1题 带时限的作业排序问题 问题描述: 设有一个单机系统、无其它资源限制且每个作业运行相等时间,不妨假定每个作业运行 1 个单位时间。现有 n 个作业,每个作业都有一个截止期限di>0,di 为整数。如果作业能够在截止期限之内完成,可获得 pi>0 的收益。问题要求得到一种作业调度方案,该方案给出
阅读全文
摘要:题目描述 问题描述: 在 n 个数当中找第k小元素。 输入: 第一行输入n的值,第二行输入n个数,第三行输入k的值。 输出: n 个数中的第k小元素。 要求: 你的算法最坏情况下应该在线性时间内完成。 示例1 : 输入: 5 8 1 3 6 9 3 输出: 6 示例 2: 输入: 10 72 6 5
阅读全文
摘要:思路 方法一:排序 对原数组从小到大排序后取出前 k 个数即可。 时间复杂度:O(nlogn),其中 n 是数组 arr 的长度。算法的时间复杂度即排序的时间复杂度。 方法二:堆 我们用一个大根堆实时维护数组的前 kk 小值。首先将前 kk 个数插入大根堆中,随后从第 k+1k+1 个数开始遍历,如
阅读全文
摘要:思路 下文使用majority来代表“数组中出现次数超过一半的数字 ” 。 方法一:哈希表 遍历数组 nums ,用 map 统计各数字的数量,即可找出 majority 。 时间复杂度:O(n) 空间复杂度:O(n) 1 class Solution { 2 private: 3 unordere
阅读全文
摘要:卡特兰数的介绍见:卡特兰数及其应用 各公式求解算法 公式1和公式2可以使用循环递推来求,公式3和公式4,可以先写一个函数求出组合数C(n,m),再用组合数进行计算。 可以使用以下递推式来求组合数C(n,m),C(n,m)可以用二维数组C[n][m]表示,通过以下公式,可以递推得出每一项的C[i][j
阅读全文
摘要:出栈次序 一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列? 常规分析 首先,我们设 f(n)=序列个数为n的出栈序列种数。(我们假定,最后出栈的元素为k,显然,k取不同值时的情况是相互独立的,也就是求出每种k最后出栈的情况数后可用加法原则,由于k最后出栈,因此,在k入栈之前,
阅读全文
摘要:思路 方法一:回溯 + 剪枝 生成所有2n个‘(’ 和“)”构成的序列,逐一判断生成的序列是否是有效的括号组合。 这里可以剪枝:在左括号/右括号的数量到达n的时候,将剩余的(2n - 左括号数-右括号数)数量 的右括号/左括号补到字符串末尾,然后对此字符串进行判断。 判断方法有两种: (1)使用栈进
阅读全文
摘要:思路 这里使用层序遍历产生的序列当成序列化,再使用此序列层序创建二叉树即对应反序列化。 使用“#”代表空节点,并且各节点的值在序列化的字符串中以空格分隔。 注:本题解法不唯一,如使用:先序遍历进行序列化 + 先序创建反序列化 也是可以的。 1 /** 2 * Definition for a bin
阅读全文
摘要:思路 方法一: 保存中序遍历的结果,然后依次处理,这里使用vector保存中序遍历结果 1 /* 2 // Definition for a Node. 3 class Node { 4 public: 5 int val; 6 Node* left; 7 Node* right; 8 9 Node
阅读全文
摘要:转载自:https://blog.csdn.net/jiangwei1994/article/details/81771963 今天想试一下vs code编译器,安装之后打开项目,想用终端执行一些命令,然而刚刚开局就遇到了坑,如下图: 终端竟然无法识别npm和node?什么鬼!于是,去cmd里看了下
阅读全文
摘要:转载自:https://www.jianshu.com/p/21f905fc7e19 我的默认终端是powershell,创建文件时会报以下错误 解决方法法:切换默认终端为cmd 1.ctrl+shift+p打开命令面板,输入select ,选中Terminal:Select Default She
阅读全文
摘要:思路 方法一:哈希表 1 /* 2 // Definition for a Node. 3 class Node { 4 public: 5 int val; 6 Node* next; 7 Node* random; 8 9 Node(int _val) { 10 val = _val; 11 n
阅读全文
摘要:思路 方法一:递归 1.最后一个节点为根节点2.左边的节点全部要小于根,右边的节点全部要大于根,因此数组可以分成两个区间,前半部分全部小于根,后半部分全部大于根3.找到两个区间的分割点,判断是否两个区间是否符合该性质 1 class Solution { 2 public: 3 bool verif
阅读全文
摘要:思路 方法一:辅助队列保存对应层数 我们可以用广度优先搜索解决这个问题。 我们可以想到最朴素的方法是用一个二元组 (node, level) 来表示状态,它表示某个节点和它所在的层数,每个新进队列的节点的 level 值都是父亲节点的 level 值加一。 最后根据每个点的 level 对点进行分类
阅读全文