- 博客(634)
- 资源 (3)
- 收藏
- 关注
原创 LeetCode第 49 题:字母异位词分组(C++)
49. 字母异位词分组 - 力扣(LeetCode)核心问题在于如何(快速)判断字母异位词,很容易想到字符串匹配里面的RK算法,其实就是一种编码方式。最简单的可以将每个单词的每个字母的ascii码加起来,因为字母异位词加起来得到的和必然是相同的,但是单词太多就可能冲突:不是字母异位词加起来也可能相同,既然加不行,可以乘啊,而且不一定非要用一个整数来编码,用字符串也可以,排序就是字符串的思路。排序class Solution {public: vector<vector<stri
2020-12-14 16:39:02
1695
原创 LeetCode第 842 题:将数组拆分成斐波那契序列(C++)
842. 将数组拆分成斐波那契序列 - 力扣(LeetCode)标准的枚举题型了,由于存在不能拆分的情况,所以应该使用带返回值的回溯,需要枚举前两个数字,然后根据前两个数字依次检查后面是否存在合法的序列,如果有,则返回true,否则返回false。class Solution {public: vector<int> res; bool dfs(string &s, int idx){//idx表示当前下标 if(idx == s.size())
2020-12-11 20:20:21
810
原创 LeetCode第 861 题:翻转矩阵后的得分(C++)
861. 翻转矩阵后的得分 - 力扣(LeetCode)可以进行的操作是行变换或列变换,最终的目的是要使得最后的数字和最大。行变换只会影响一个数字(该行的数字)。由于矩阵的 0/1 呈现的是二进制格式(数字是按照行计算的),所以位1越靠右数字就会越大。不难得出,第一位不是1的数字(示例中最大为0111 = 7)肯定小于第一位是1的数字(示例中最小为1000 = 8 > 7),所以如果某一行的第一位不是1,那为达目的就需要进行行变换。相反地,如果第一位已经是1了,那就不能进行行变换了。进行完上面
2020-12-08 20:08:04
775
原创 面试题 01.07. 旋转矩阵
面试题 01.07. 旋转矩阵 - 力扣(LeetCode)一样的:LeetCode第 48 题:旋转图像(C++)_zj-优快云博客class Solution {public: void rotate(vector<vector<int>>& matrix) { int m = matrix.size(); for(int i = 0; i < m; ++i){//转置,沿左上-右下对角线 f
2020-11-25 21:27:17
253
原创 LeetCode第 1370 题:上下升降字符串(C++)
1370. 上升下降字符串 - 力扣(LeetCode)题目有点难读懂,大体意思就是先升序再降序来回走,可以使用桶排序的思路:把不同的字母放在不同的桶里面,相同的字母放在同一个桶里面。假设桶为a--z,先从a桶出发,如果桶里面有元素,就取出一个(追加到res),一直走到z桶,此时又从z桶出发,向a桶的方向走,如此来回反复即可。class Solution {public: int count[26]; string sortString(string s) { for
2020-11-25 21:09:30
304
原创 面试题 01.06. 字符串压缩
面试题 01.06. 字符串压缩 - 力扣(LeetCode)相似题:LeetCode第 443 题:压缩字符串(C++)_zj-优快云博客class Solution {public: string compressString(string S) { string res; int cnt = 1, n = S.size(); for(int i = 0; i < n; ++i){ if(i == n-1 |
2020-11-24 19:07:23
427
原创 面试题 01.05. 一次编辑
面试题 01.05. 一次编辑 - 力扣(LeetCode)LeetCode第 72 题:编辑距离(C++)_zj-优快云博客的简单版本,照抄即可:class Solution {public: bool oneEditAway(string first, string second) { int m = first.size(), n = second.size(); if(abs(m-n) > 1) return false;
2020-11-18 22:17:15
431
原创 面试题 01.04. 回文排列
面试题 01.04. 回文排列 - 力扣(LeetCode)如果是某个回文串的排列之一,那么:所有字母个数均为偶数或者仅有一个字母个数为奇数(放在回文序列中间)。class Solution {public: bool canPermutePalindrome(string s) { int count[128] = {0}; for(const auto &c : s){//加1减1,不用累加数量 if(count[c] ==
2020-11-18 21:00:17
409
原创 面试题 01.03. URL化
面试题 01.03. URL化 - 力扣(LeetCode)开一个res,一遍遍历一遍存储结果:class Solution {public: string replaceSpaces(string S, int length) { string res; for(int i = 0; i < length; ++i){ if(isspace(S[i])) res += "%20"; else res
2020-11-18 20:34:02
242
原创 面试题 01.02. 判定是否互为字符重排
面试题 01.02. 判定是否互为字符重排 - 力扣(LeetCode)简单的哈希表思路,遍历计数即可:class Solution {public: bool CheckPermutation(string s1, string s2) { if(s1.size() != s2.size()) return false; int count[26] = {0}; for(int i = 0; i < s1.size(); ++i){
2020-11-18 19:09:30
224
原创 面试题 01.01. 判定字符是否唯一
面试题 01.01. 判定字符是否唯一 - 力扣(LeetCode)使用哈希表就会很简单,时空复杂度都是o(n)class Solution {public: bool isUnique(string astr) { bool flag[128] = {false}; for(const auto &c : astr){ if(!flag[c]) flag[c] = true; else retur
2020-11-18 18:36:51
216
原创 LeetCode第 1030 题:距离顺序排列矩阵单元格(C++)
1030. 距离顺序排列矩阵单元格 - 力扣(LeetCode)其实就是定义一个排序规则的问题使用优先级队列class Solution {public: vector<vector<int>> allCellsDistOrder(int R, int C, int r0, int c0) { vector<vector<int>> res; //https://blog.youkuaiyun.com/qq_3252371
2020-11-17 11:21:41
238
原创 LeetCode第 406 题:根据身高重建队列(C++)
406. 根据身高重建队列 - 力扣(LeetCode)看标签是贪心算法的思路,可是为啥贪心就合理呢?虽然是中等难度,可是想好久没想出为啥…首先是先排序,按照第一个元素逆序,第二个元素正序,那么每一个元素之前的元素的个数,就是大于等于它的元素数量。个头高的人会忽略个头比它矮的人,只会在意个头大于等于它的人。样例:[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]排序之后:[[7,0], [7,1], [6,1], [5,0], [5,2], [4,4]]
2020-11-16 22:10:30
848
原创 LeetCode第 514 题:自由之路(C++)
514. 自由之路 - 力扣(LeetCode)一开始感觉是要用贪心,后来发现贪心是错的。还是dp吧,详解可以看官方题解:自由之路 - 自由之路 - 力扣(LeetCode),还是比较好理解的。class Solution {public: int dp[110][110];//从前往后拼出key的第i个字符,ring 的第j个字符与12:00方向对齐的最少步数 int findRotateSteps(string ring, string key) { int m
2020-11-13 15:20:08
300
原创 LeetCode第 973 题:最接近原点的 K 个点(C++)
973. 最接近原点的 K 个点 - 力扣(LeetCode)topK问题,优先级队列的典型应用:class Solution {public: struct cmp{ bool operator()(const pair<int, int> &a, const pair<int, int> &b){ return a.first*a.first + a.second*a.second < b.first*
2020-11-09 11:32:56
358
原创 LeetCode第 1356 题:根据数字二进制下 1 的数目排序(C++)
1356. 根据数字二进制下 1 的数目排序 - 力扣(LeetCode)简单题,自己设计一个排序规则就可以了,可以使用bitset简化操作:class Solution {public: struct cmp{ bool operator()(int a, int b){ if(bitset<14>(a).count() == bitset<32>(b).count()) return a < b;//最大10^4
2020-11-06 15:33:16
348
原创 c++ setw(int n)函数
setw - C++ Reference头文件:#include <iomanip>函数原型:setw (int n);用于输出流中进行字段宽度设置,n表示字段宽度。具有以下几个特点:Sets the number of characters to be used as the field width for the next insertion operation.意思就是只对紧挨着的下一次输出有效右对齐:输出字段宽度小于 n 时,字段前面用空格补齐输出字段宽度大于 n
2020-11-05 19:51:38
821
原创 LeetCode第 45 题:跳跃游戏 (C++)
45. 跳跃游戏 II - 力扣(LeetCode)贪心算法的思路:注意数值代表的是可以跳跃的最大长度,也就是说是最多可以跳这么远,但是不跳这么远也行。看示例:[2,3,1,1,4]i= 0,第一次站在数字2的位置,最多可以跳两个,也就是活可以跳到3(下标1)的位置,也可以跳到1(下标2)的位置。那跳到哪个位置好呢?首先肯定会向哪儿的数值越大就跳到哪儿,但是这样不是很对,虽然这儿确实是跳到3的地方好。因为,3的位置相对与1的位置来说,3靠前一个身位,假设我跳到3,后续从3往后跳的时候,还是会经过
2020-11-03 22:10:44
895
原创 LeetCode第 44 题:通配符匹配 (C++)
44. 通配符匹配 - 力扣(LeetCode)相似的题目:LeetCode第 10 题:正则表达式匹配 (C++)_zj-优快云博客dp思路都是一样的:class Solution {public: bool isMatch(string s, string p) { int m = s.size(), n = p.size(); vector<vector<int>> dp(m+1, vector<int>(n+1,
2020-11-03 20:58:30
427
原创 LeetCode第 941 题:有效的山脉数组(C++)
941. 有效的山脉数组 - 力扣(LeetCode)简单题,就直接遍历就可以了,方法也有很多种class Solution {public: bool validMountainArray(vector<int>& A) { int n = A.size(); if(n < 3) return false; int i = 0; while(i < n-1 && A[i]
2020-11-03 14:52:24
446
原创 LeetCode第 37 题:解数独(C++)
37. 解数独 - 力扣(LeetCode)相当于进阶:LeetCode第 36 题:有效的数独(C++)_zj-优快云博客dfs枚举:class Solution {public: int row[9][9], col[9][9], block[9][9]; void solveSudoku(vector<vector<char>>& board) { for(int i = 0; i < 9; ++i){
2020-11-02 22:02:32
708
原创 LeetCode第 36 题:有效的数独(C++)
36. 有效的数独 - 力扣(LeetCode)关于行和列,使用哈希表记录就可以了。3x3的方格也是使用哈希表映射,但是怎样映射可以将一个块内的元素都映射到正确的位置呢?需要对横纵坐标进行一下变换。假设使用block[9][9]用来映射块,每一行代表一个3*3的方块,列下标对应数字,那么block[3][4] = true代表第四个方块中已经存在5(4+1)这个数字:上图中每一个方块映射到block数组中,对应的横坐标为:i/3 * 3 + j/3,i是行标,j是列标。行标决定一组block的起始
2020-11-02 16:55:26
501
原创 LeetCode第 29 题:两数相除(C++)
29. 两数相除 - 力扣(LeetCode)要求不使用乘法、除法和 mod 运算符,但是乘法、除法、mod都是可以使用加减进行模拟的,假设输入分别为15、3,res表示结果:15 > 3: res置为1(代表结果至少为1),3 += 3(翻倍)得到615 > 6: 比翻倍之后的数还要大,res置为2(1 += 1),6 += 6得到1215 > 12: res置为4,12 += 12得到2415 < 24,循环终止,此时的res为4,代表15里面至少有4个3,但是还没
2020-11-02 11:29:18
568
1
原创 LeetCode第 463 题:岛屿的周长(C++)
463. 岛屿的周长 - 力扣(LeetCode)很巧妙的思路:存在一个1就会产生四条边一旦相邻边的数量就会减少2:方格A和方格B相邻,方格A,B需要分别减少一条边class Solution {public: int res = 0; int islandPerimeter(vector<vector<int>>& grid) { int n = grid.size(), m = grid[0].size();
2020-10-30 21:06:27
435
原创 LeetCode第 129 题:求根到叶子节点数字之和(C++)
129. 求根到叶子节点数字之和 - 力扣(LeetCode)dfs遍历就可以了:class Solution {public: int res; void dfs(TreeNode* root, int cur){ if(!root->left && !root->right){ res += cur; return; } if(root->left)
2020-10-29 19:10:18
171
原创 LeetCode第 166 题:分数到小数(C++)
166. 分数到小数 - 力扣(LeetCode)参考;C++:模拟题(简单易懂) - 分数到小数 - 力扣(LeetCode)这种题真的很烦class Solution {public: string fractionToDecimal(int numerator, int denominator) { if(denominator == 0) return ""; if(numerator == 0) return "0"; st
2020-10-29 11:27:19
255
原创 翻转栈中的元素(不使用额外数组或者队列)
如果想要反转栈中的元素,可以使用队列作为辅助数据结构的话,就来回倒腾一下就可以了。但是如果不使用队列应该怎么做呢?今天百度面试就被问到了。。。那必然就是使用递归来操作了,关键是怎么去组织递归呢?下来考虑简单的问题,如何将栈底的元素挪动到栈顶?也就是这样:怎么把0挪动到最上面?我们需要获取0,可是使用一个自下而上的递归把最底下的0传递出来(作为递归返回值):int get(stack<int> &s){ int v = s.top(); s.pop();
2020-10-25 21:15:34
1021
原创 LeetCode第 836 题:矩形重叠(C++)
836. 矩形重叠 - 力扣(LeetCode)类似:LeetCode第 223 题:矩形面积(C++)_zj-优快云博客但是class Solution {public: bool isRectangleOverlap(vector<int>& rec1, vector<int>& rec2) { if(rec1[0] >= rec2[2] || rec1[1] >= rec2[3] || rec1[2] <=
2020-10-24 21:53:00
541
原创 LeetCode第 223 题:矩形面积(C++)
223. 矩形面积 - 力扣(LeetCode)参考:简单的考虑 - 矩形面积 - 力扣(LeetCode)那么重叠的时候,重叠区域的边界:上边界,取两个矩形的上边界的最小值下边界,取两个矩形的下边界的最大值左边界,取两个矩形的左边界的最大值右边界,取两个矩形的右边界的最小值那么重叠区域的面积就容易计算了class Solution {public: int computeArea(int A, int B, int C, int D, int E, int
2020-10-24 21:35:31
453
原创 面试题 05.04. 下一个数
面试题 05.04. 下一个数 - 力扣(LeetCode)转化为bitset,然后再转为string,直接使用函数next_permutation()和prev_permutation(),感觉像是投机取巧。。。
2020-10-22 22:30:49
200
原创 LeetCode第 1299 题:将每个元素替换为右侧最大元素(C++)
1299. 将每个元素替换为右侧最大元素 - 力扣(LeetCode)class Solution {public: vector<int> replaceElements(vector<int>& arr) { int n = arr.size(); vector<int> res(n, -1); for(int i = n-2; i >= 0; --i){ if(arr
2020-10-22 21:39:31
208
原创 LeetCode第 228 题:汇总区间(C++)
228. 汇总区间 - 力扣(LeetCode)遍历就完事了,没啥好说的class Solution {public: vector<string> res; vector<string> summaryRanges(vector<int>& nums) { int l = 0, r = l, n = nums.size(); while(r < n){ while(r <
2020-10-22 20:44:50
221
原创 LeetCode第 162 题:寻找峰值(C++)
162. 寻找峰值 - 力扣(LeetCode)二分法:class Solution {public: //相邻的数只有两种情况: // nums[mid] > nums[mid + 1] 或 nums[mid] < nums[mid + 1] int findPeakElement(vector<int>& nums) { int l = 0, r = nums.size()-1; while(l < r
2020-10-22 19:46:26
438
转载 malloc 底层实现及原理
原文:malloc 底层实现及原理 - 爱笑的张飞 - 博客园文章目录结论具体内容内存分配的原理具体分配过程情况一:malloc 小于 128K 的内存,使用 brk 分配情况二:malloc 大于 128K 的内存,使用 mmap 分配(munmap 释放)摘要:偶尔看到面试题会问到 malloc 的底层原理,今天就来记录一下,毕竟学习要“知其所以然”,这样才会胸有成竹。注:下面分析均是基于 linux 环境下的 malloc 实现。步骤是:先总结结论,再逐步展开结论1)当开辟的空间小于 12
2020-10-22 11:24:08
1790
原创 找出数组中每个数右边第一个比它大的元素
题目:给定一个整型数组,数组元素随机无序的,要求打印出所有元素右边第一个大于该元素的值。如果不存在,对应值设为-1即可。如数组A=[1,5,3,6,4,8,9,10] 输出[5, 6, 6, 8, 8, 9, 10, -1]如数组A=[8, 2, 5, 4, 3, 9, 7, 2, 5] 输出[9, 5, 9, 9, 9, -1, -1, 5, -1]首先暴力法就不用说了,两层遍历就可以。不过这种题目是典型的单调栈的思路,可以一次遍历就得出所有结果。用栈来保存未找到右边第一个比它大的元素的索引(很
2020-10-21 21:22:35
1080
原创 LeetCode第 414 题:第三大的数(C++)
414. 第三大的数 - 力扣(LeetCode)典型的topk,优先级队列,不过这儿需要处理重复元素,可以使用哈希表自动去重class Solution {public: int thirdMax(vector<int>& nums) { unordered_set<int> s(nums.begin(), nums.end()); int n = s.size(); if(n < 3) return
2020-10-20 23:48:11
384
原创 LeetCode第 445 题:两数相加 II(C++)
445. 两数相加 II - 力扣(LeetCode)这儿的顺序与正常的相加不一样,使用栈倒腾一下就可以了。class Solution {public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { stack<int> s1, s2; while(l1){ s1.push(l1->val); l1 = l1->next;
2020-10-20 21:25:01
227
原创 LeetCode第 41 题:缺失的第一个正数(C++)
41. 缺失的第一个正数 - 力扣(LeetCode)要找的是第一个正数。使用换座位的思路,把每个正数放在它应该在的位置上去(1放在第一位,2放在第二位。。。)class Solution {public: int firstMissingPositive(vector<int>& nums) { int n = nums.size(); for(int i = 0; i < n; ++i){ while(nu
2020-10-20 20:45:40
443
原创 C++ 的placement new和placement delete
参考:placement new和placement delete_hujing_Liu-优快云博客《effctive C++》p256通常的C++程序中,new和delete表达式总是成对出现,并且分别调用了全局的operator new和operator delete,这两个全局操作符(或者直接理解为全局的函数)的基本形式如下:void * operator new ( std::size_t) throw ( std::bad_alloc );void operator delete (
2020-10-20 16:08:56
1638
原创 LeetCode第 165 题:比较版本号(C++)
165. 比较版本号 - 力扣(LeetCode)需要按照 .进行分割,c++里面分割最方便的就是使用stringstream了,可以首先将两个字符串的.的数量增加到一致(补0就可以了):class Solution {public: int compareVersion(string version1, string version2) { int cnt1 = count(version1.begin(), version1.end(), '.'); in
2020-10-20 14:52:23
482
(可直接运行)国外的seam carving matlab源码(包含gui)
2018-04-19
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人