- 博客(35)
- 收藏
- 关注
原创 LeetCode#811 Subdomain Visit Count
1、关键就在于分词。2、(1)string的find()函数查找的是字符(串)出现位置的下标,而非迭代器!(2)、int转string:全局函数std::to_stringstring转int:std::stoi/stol/stoll https://zh.cppreference.com/w/cpp/string/basic_string/stolclass Solution {pub...
2019-08-05 10:44:41
145
原创 LeetCode#211 Add and Search Word - Data structure design
1、本题与先前的Trie树相比,最大的差别就在引入了对通配符".“的处理。但由于引入此,就需要在出现”."的同一节点分支全部进行搜索,才能不漏掉所有可能。2、搜索采用递归较好。class WordDictionary {private: struct TNode{ char key; map<char, TNode*> node; ...
2019-08-05 10:40:12
676
原创 LeetCode#199 Binary Tree Right Side View
以层为单位,取每层最右(结束)处的元素。#define SIZE 32/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left...
2019-07-30 17:04:30
105
原创 LeetCode#208 Implement Trie-Prefix Tree
LeetCode#208 Implement Trie-Prefix Tree1、C++使得struct也能作为类使用,可以包含函数。同时struct可以有自己的构造函数其定义方法为(1)struct TNode{ char key; map<char, TNode*> NextMap;};实际上,可以在定义的同时创建一个对象,如(2)struct TNo...
2019-07-30 16:03:21
102
原创 LeetCode#23 Unique Binary Search Trees
1、对于任意一个数,它为根时不同的二叉搜索树个数是左子树个数与右子树个数的乘积,左右子树又各自分治下去。因此,n个数有多少种其实就是1~n每一个作为根节点不同的二叉搜索树个数的和。更长的序列会用到先前序列的结果,是典型的动态规划思想。需要注意的是边界条件:左边没有或只有一个节点时都记为12、直接用公式也是可以的class Solution {public: int numTrees...
2018-09-21 23:32:19
91
原创 LeetCode#877 Stone Game
1、直接判胜;2、计算从i到j的胜利点数。这里用超过对手的点数来表示胜负。首先,既然d[0][n-1] = max(p[0]-d[1][n-1], p[n]-d[0][n-2] ,那么,这样依次扫描即可。但需要注意的是边界条件,即d[i][j] 是什么:需要计算每一个区间的最值。这里使用区间距离来拆分,即将其拆成多个长度为1/2/3…/n的区间分别计算每个区间最值,才能得出d[0][n-1]...
2018-09-21 22:28:03
171
原创 LeetCode#413 Arithmetic Slices
1、对于三个数的等差数组,计数+1;对于多个数的等差数组,拆分,公式为(c-2)*(c-1)/2 。用一个sum累加即可,count随用虽丢。注意边界条件及状态转移。class Solution {public: int numberOfArithmeticSlices(vector<int>& A) { int n = A.size(); ...
2018-09-21 22:21:23
88
原创 LeetCode#64 Minimum Path Sum
1、对于一个矩阵,可以按照向右或向下将其拆分。右下角的值取上或左中较小值即可。依次遍历即可。class Solution {public: int minPathSum(vector<vector<int>>& grid) { int m = grid.size(); int n = grid[0].size(); ...
2018-09-21 22:17:16
134
原创 LeetCode# 338 Counting Bits
1、mark一下class Solution {public: vector<int> countBits(int num) { vector<int> result(num+1, 0); result[0] = 0; for(int i = 1; i <= num; i++){ re...
2018-09-21 22:13:19
92
原创 LeetCode#121 Best Time to Buy and Sell Stock
1、从左至右遍历,当前区间的最大利润是前一个区间的最大利润或当前股票价值减前一个区间最小值,取高者。每一个区间都有一个利润与最小值,依次比较替换即可。class Solution {public: int maxProfit(vector<int>& prices) { if(prices.size() == 0 || prices.size() =...
2018-09-21 22:01:43
87
原创 LeetCode#303 Range Sum Query
1、利用动态规划思想,sum(i, j) 实际上是sum(0, j) - sum(0, i-1) 。2、构造一个逐次累加和的数组,返回i、j两项相减结果即可。class NumArray {public: NumArray(vector<int> nums) { sums.clear(); sums.push_back(0); ...
2018-09-21 21:57:21
130
原创 LeetCode#53 Maximum Subarray
1、对于当前已计算区间,只要sum<0则丢弃。单独的result记录历史最高,选取当前高于其的sum替换。class Solution {public: int maxSubArray(vector<int>& nums) { int sum = 0; int result = nums[0]; for(i...
2018-09-09 01:16:00
71
原创 LeetCode#746 Min Cost Climbing Stairs
1、同#53、#121,都是不断取最好结果。 这里是:最后必定需要判断从i-1或i-2抵达的花费,因此层层递推,最后算到2和3的为为止。class Solution {public: int minCostClimbingStairs(vector<int>& cost) { cost.push_back(0); int n ...
2018-09-09 01:10:50
87
原创 LeetCode#628 Maximum Product of Three Numbers
1、一种办法是遍历,取出最大两个数、最小两个数,然后分情况讨论。 2、排序后直接讨论也可以: (1)、全为非负数或全为负,确定; (2)、仅有一个负数,确定(同全为非负); (3)、存在两个以上负数与一个正数:比较即可。class Solution {public: int maximumProduct(vector<int>&...
2018-09-09 00:58:45
210
原创 LeetCode#830 Positions of Large Group
1、仍然考虑建索引map,存储起始位置。当然,仅3个以上才存,这在遍历时可以做到。最后只需要遍历map即可。class Solution {public: vector<vector<int>> largeGroupPositions(string S) { int n = S.size(); if(n < 3) ...
2018-09-09 00:53:33
87
原创 LeetCode#88 Merge Sorted Array
1、启用额外空间中转当然可以; 2、使用尾指针从后往前填充。注意两点:n先被用完之后即停止、使用三元式时一定要注意赋值的先后:m是否被完全填充与tail[p1]class Solution {public: void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) { ...
2018-09-09 00:50:28
104
原创 LeetCode#35 Search Insert Position
1、二分是较好的方法:但这里要注意区间取值的细节。 首先,我们可以得出这样的结论:插入元素满足nums[i-1]<target<=nums[i] 也就是说或者较大,在其之后;或者替换(较小或相等)。知道了这一点就好确定区间的取法与判断的边界条件了:首先,不能左右边界相等,因为最后区间一定会收敛在一个数上,但可能不存在; int leftPtr = 0;...
2018-09-09 00:25:38
103
原创 LeetCode#697 Degree of Array
1、比较笨的方式是先用vector给每一个元素计数(注意这个vector的长度,原数组可能有负数),然后找到degree并记录哪些元素是候选项;再针对每一个候选项遍历原数组。 很笨的方法但很有效;if(nums.size() == 1) return 1;vector<int>::iterator iter = max_element(nums.begin()...
2018-09-08 20:57:13
122
原创 LeetCode#217 Contains Duplicate
1、首先,范围在整数内,且有可能不连续,因此考虑提取最大元素与最小元素,构造一个能够为原数组中正负所有元素索引的空间,max+(min < 0 ? abs(min) : 0) + 1 作为大小,对每一个nums[i] 对应的位置标记(注意min为负数导致的偏移)。 2、利用hash表也是一种思路 3、vector有min_element()函数,用迭代器确定位置,可以写成begin(ar...
2018-09-05 23:52:30
134
原创 LeetCode#448 Find All Numbers Disappeared in Array
1、最慢的方式是两层for循环,不考虑; 2、更先进的方法是这样的:不考虑是否直接出现了这个数,而考虑这个数是否出现在了下标中,即:以nums[i] 为索引标记这个位置,最后没有标记的位置就是缺失的数。也就是将数组中的数看作索引。这里被标记处的数置负,abs后可以重新使用。 3、为了优化性能,可以使用双目运算符; 4、在牺牲空间的前提下,可以省去第一次标记时的判断class Solu...
2018-09-05 23:05:15
108
原创 LeetCode#167 Two Sum II - Input Array is Sorted
1、这在之前的的基础上更好做一点。前面的问题需要查表,这里直接在原数组上就可以了——二分。对于待查数据,使用二分缩小区间直至找到,是很好的算法。 2、更精妙的方法是双指针,头尾两个指针,相加和大了,则尾指针后移,和小了就首指针前移,直到确定两个数的位置。class Solution {public: vector<int> twoSum(vector<int&...
2018-09-05 22:32:18
81
原创 LeetCode#661 Image Smoother
1、很明显,对于内层需要上下左右八个方向的计算,边界则随位置而定。这里为求简便,就直接每个元素把八个方向来一遍。 2、这里使用vectorclass Solution {public: vector<vector<int>> imageSmoother(vector<vector<int>>& M) { if...
2018-09-05 22:26:06
122
原创 Leetcode#1 Two Sum
1、最简单的方式是两个嵌套的for循环,对每一个元素找一遍。 2、为了提升效率,只能在内层查找时提升效率,才能从n^2 的复杂度降下来。考虑就用map 3、map的根本就是键值对,内部采用二叉树处理,每一个键值对是唯一的,因此可以用map来存储并查找。因此思路就是先存储在map中,再对每一个进行查找,两次独立的for循环。 4、但map存在自己的问题:相同键值会覆盖value 5、实际上这...
2018-08-24 17:50:22
102
原创 LeetCode#121 Best Time to Buy and Sell Stock
1、必须保证当前确定的最小数在最大数之前,可以等价为将当前作为最大数永远取与此区间中最小数的最大差值。max(profit, prices[i]-minPrice)class Solution {public: int maxProfit(vector<int>& prices) { if(prices.size() == 0 || p...
2018-08-16 03:37:54
89
原创 LeetCode#268 Missing Number
1、首先观察,对于1~n,最终的数组肯定会漏掉0~n中的某一个数,很自然的和相减就可以得知是哪一个;class Solution {public: int missingNumber(vector<int>& nums) { int len = nums.size(); int totalSum = len * (len + 1...
2018-08-15 20:39:59
136
原创 LeetCode#122 Best Time to Sell and Buy Stock II
1、初看时感觉很复杂,好像需要看之后很多天再择优。实际上画出折线图就能看到,这样做只是对最长区间取了一次计算,当股票一直上升时当然是最优解,但一旦中间出现下跌,就少算了上涨的这一段。 简单来说,低买高卖一定没错。 那么为什么? 2、这里是一个推导:为什么这样最优class Solution {public: int maxProfit(vector&lt;int&gt;&a...
2018-08-15 20:09:39
88
原创 LeetCode#119 Pascal's Triangle II
1、首先,最笨的方法就是按照#118算完后取出相应行。 2、但是,根据二项式定理,我们可以知道,这实际上就是求每一项的系数,此时,可以利用公式递推计算 当然,我们非常容易想到,n>=33,简单计算便知道超了,因此用64位。class Solution {public: vector<int> getRow(int rowIndex) { if...
2018-08-15 18:11:00
129
原创 LeetCode#283 Move Zeroes
1、最基础的就是冒泡,一个一个比较、交换位置class Solution {public: void moveZeroes(vector&lt;int&gt;&amp; nums) { for(int i = 1; i &lt; nums.size(); i++){ if(nums[i] != 0){ int...
2018-08-12 19:03:28
89
原创 LeetCode#695 Max Area of Island
1、很明显,这是一个图的遍历。采用深度优先遍历的递归如下:每一个节点都完成向四周的扩散直至达到顶点class Solution {private: int dfs(vector<vector<int>>& grid, int i, int j){ if(i < 0 || i >= m || j < 0 || j &g...
2018-08-12 17:59:43
232
原创 LeetCode#169 Majority Element
1、由于规定超过半数,则排序后最中间的位置(奇数)、左右(偶数)必定为众数。恰好,除法向下取整。class Solution {public: int majorityElement(vector<int>& nums) { sort(nums.begin(), nums.end()); return nums[nums.si...
2018-08-11 21:42:10
94
原创 LeetCode#766 Toeplitz Matrix
1、递推每条对角线,从上至下isTm+ptr为列坐标总从0开始,行坐标ptr同;从左至右ptr行坐标,isTn+ptr列坐标。 2、注意1*n n*1也是。。。class Solution {public: bool isToeplitzMatrix(vector<vector<int>>& matrix) { int m = m...
2018-08-11 21:20:41
116
原创 LeetCode#118 Pascal's Triangle
1、可以遍历,但折半显然好一点; 2、!!!一定注意“非负”; 3、对象的写法{{}}class Solution {public: vector<vector<int>> generate(int numRows) { if(numRows == 0) return {}; if(numRows == 1) retu...
2018-08-08 23:19:33
98
原创 LeetCode#566 Reshape the Matrix
1 、在第几个与行列位置之间的换算时,需要考虑怎样满足数组下标从0开始。 例如,第12个在3*4矩阵的第三行第四列,使用/时12/4=3...0,显然不满足数组要求。其应在[2][3]处,即11/4=2...3。 2、vector<vector<int>> v(r, vector<int>(c, 0));这种写法需要掌握class Solu...
2018-08-08 23:15:09
90
原创 LeetCode#561 Array Partition
1、总是牺牲较大的那一个,因此需要被牺牲的数总和最小,例如1+2+3+4...+n/2这是理论上的最小值,但1没有对应的较小值,2有。依次错位互为较小1+3+5....这是可以获得的最小值 2、sort的用法及其在容器中的使用class Solution {public: int arrayPairSum(vector<int>& n...
2018-08-08 01:26:10
75
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人