02 2020 档案
摘要:参考文献:https://www.jianshu.com/p/e59d51e1eef5 单调队列,顾名思义,是一种具有单调性的队列。众所周知,单调性有单调递增和单调递减两种,相应的单调队列也分为单调递增队列和单调递减队列两种。 单调递增队列:保证队列头元素一定是当前队列的最小值,用于维护区间的最小值
阅读全文
摘要:62. 丑数 我们把只包含质因子2、3和5的数称作丑数(Ugly Number)。 例如6、8都是丑数,但14不是,因为它包含质因子7。 求第n个丑数的值。 思路:定义三个指针,分别指向所在的最小值,每次取最小值; class Solution { public: int getUglyNumber
阅读全文
摘要:57. 数字序列中某一位的数字 数字以0123456789101112131415…的格式序列化到一个字符序列中。 在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。 请写一个函数求任意位对应的数字。 思路:数字按位数分类分别有9,90,900,9000……个数 class
阅读全文
摘要:58. 把数组排成最小的数 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。 例如输入数组[3, 32, 321],则打印出这3个数字能排成的最小数字321323。 class Solution { public: string printMinNumbe
阅读全文
摘要:1、最长不含重复字符的子字符串 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 假设字符串中只包含从’a’到’z’的字符。 思路:前后指针分别指向不重复的最前和最后,后指针每次后移时,更新前指针: map保存的是字符对应的位置; class Solution { pu
阅读全文
摘要:1、两个链表的第一个公共结点 输入两个链表,找出它们的第一个公共结点。 当不存在公共节点时,返回空节点。 思路:让两个指针分别走一遍两个链表,交点就是公共节点: /** * Definition for singly-linked list. * struct ListNode { * int va
阅读全文
摘要:归并排序模板: void merge(vector<int>& nums, int l, int r){ if ( l >= r) return 0;//只有一个数 int mid = l+r >>1; //递归左右排序 merge(nums,l,mid); merge(nums,mid+1,r);
阅读全文
摘要:54. 数据流中的中位数 如何得到一个数据流中的中位数? 如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。 如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。 样例 输入:1, 2, 3, 4 输出:1,1.5,2,2.5 解释:每当数据流读
阅读全文
摘要:class Solution { public: vector<vector<int>> permutation(vector<int>& nums) { vector<vector<int>> res; //先从小到大 sort(nums.begin(),nums.end()); res.push
阅读全文
摘要:169. 多数元素 给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 比较容易想到有hash,排序;难想到的有位运算的方法; 摩尔投票法: class Solution { publi
阅读全文
摘要:48. 复杂链表的复刻 请实现一个函数可以复制一个复杂链表。 在复杂链表中,每个结点除了有一个指针指向下一个结点外,还有一个额外的指针指向链表中的任意结点或者null。 注意: 函数结束后原链表要与输入时保持一致。 /** * Definition for singly-linked list wi
阅读全文
摘要:40. 顺时针打印矩阵 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 class Solution { public: vector<int> res; vector<vector<int> > mp; vector<vector<bool> > vis; int m, n; vo
阅读全文
摘要:41. 包含min函数的栈 设计一个支持push,pop,top等操作并且可以在O(1)时间内检索出最小元素的堆栈。 push(x)–将元素x插入栈中 pop()–移除栈顶元素 top()–得到栈顶元素 getMin()–得到栈中最小元素 单调栈) O(1) https://www.acwing.c
阅读全文
摘要:37. 树的子结构 输入两棵二叉树A,B,判断B是不是A的子结构。 我们规定空树不是任何树的子结构。 class Solution { public: map<TreeNode*,bool> mp bool issub(TreeNode* p1,TreeNode* p2){ if(p2 == NUL
阅读全文
摘要:10. 正则表达式匹配 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。 '.' 匹配任意单个字符'*' 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。 class Solution { public: bo
阅读全文
摘要:29. 删除链表中重复的节点 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留。 class Solution { public: ListNode* deleteDuplication(ListNode* head) { //虚拟头结点 ListNode* pre =
阅读全文
摘要:18. 重建二叉树 输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树。 class Solution { public: vector<int> pre,in;//简化传参; map<int,int> mp;//hash改进,减少每次都要查找 TreeNode* buildTree(vecto
阅读全文
摘要:13. 找出数组中重复的数字 给定一个长度为 n 的整数数组 nums,数组中所有的数字都在 0∼n−1的范围内。 数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。 请找出数组中任意一个重复的数字。 注意:如果某些数字不在 0∼n−1 的范围内,或数组中不包含重复数字,
阅读全文
摘要:背包九讲类型汇总: 1.01背包问题 2.完全背包问题 3.多重背包问题 4.混合背包问题 5.二维费用的背包问题 6.分组背包问题 7.有依赖的背包问题 8.背包问题求方案数 9.求背包问题的具体方案 1. 01背包问题 Acwing 02 有 N 件物品和一个容量是 V的背包。每件物品只能使用一
阅读全文
摘要:1、最长公共子序列 对于两个子序列 S1 和 S2,找出它们最长的公共子序列。 定义一个二维数组 dp 用来存储最长公共子序列的长度,其中 dp[i][j] 表示 S1 的前 i 个字符与 S2 的前 j 个字符最长公共子序列的长度。考虑 S1i 与 S2j 值是否相等,分为两种情况: 当 S1i=
阅读全文
摘要:基本思想: 300. 最长上升子序列 M 给定一个无序的整数数组,找到其中最长上升子序列的长度。 通用方法: class Solution { public: int lengthOfLIS(vector<int>& nums) { int n = nums.size(); if (n == 0)
阅读全文
摘要:2020-02-15 343. 整数拆分 M(乘积最大化) 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 max函数可以使用initializer_list,用来求多个数的最值; class Solution { public: int i
阅读全文
摘要:2020-02-15 303. 区域和检索 - 数组不可变 E 给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。 一维前缀和: class NumArray { public: vector<long long> dp; NumArra
阅读全文
摘要:64. 最小路径和 E 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 (最简单的模板题) class Solution { public: int minPathSum(vector<vector<in
阅读全文
摘要:2020-02-13 70. 爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 最基本的问题: dp[i] = dp[i-1] + dp[ i - 2] class Solution { public: int climb
阅读全文
摘要:81. 搜索旋转排序数组 II 33. 搜索旋转排序数组 代码一样: 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。 编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回
阅读全文
摘要:二分问题可以按循环条件总结为两个模板: 循环条件为(left <= right): while(left <= right) { int mid = (right + left) / 2; if(nums[mid] == target) return mid; else if (nums[mid]
阅读全文
摘要:最简单: 122. 买卖股票的最佳时机 II (能够买卖无数次) 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。 注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 cla
阅读全文
摘要:2020-02-10 5311. 将数字变成 0 的操作次数 给你一个非负整数 num ,请你返回将它变成 0 所需要的步数。 如果当前数字是偶数,你需要把它除以 2 ;否则,减去 1 。 class Solution { public: int numberOfSteps (int num) {
阅读全文
摘要:2020-02-09 22:44:14 5332. 检查整数及其两倍数是否存在 给你一个整数数组 arr,请你检查是否存在两个整数 N 和 M,满足 N 是 M 的两倍(即,N = 2 * M)。 更正式地,检查是否存在两个下标 i 和 j 满足: i != j0 <= i, j < arr.len
阅读全文

浙公网安备 33010602011771号