- 博客(77)
- 收藏
- 关注
原创 187. 重复的DNA序列
187. 重复的DNA序列187. 重复的DNA序列我的思路一种直觉:字典树。把字符串 sss 从头开始每 10 个作为一个新的字符串,加入到字典树中,对于当前新字符串 sis_isi:如果 sis_isi 出现在字典树中,那么将该字符串加入结果中。注意,应该现将字符串加入一个集合 中,因为当前字符串可能会有和它重复的字符串,且不止一个。如果 sis_isi 没出现在字典树中,那么将它插入到字典树中。设字典树的深度是 LLL,那么显然,L=10L=10L=10。也就是说,我们能在 O
2021-10-09 14:11:19
264
原创 474. 一和零
474. 一和零474. 一和零我的思路题意分析相当于给你一个数组 strs=[(a0,b0),(a1,b1)…(al−1,bl−1)]strs = [(a_0,b_0), (a_1, b_1) \ldots (a_{l-1}, b_{l-1})]strs=[(a0,b0),(a1,b1)…(al−1,bl−1)], aia_iai是 0 的个数,bib_ibi是 1 的个数,数组长度为 lll。同时给你两个数字(m,n)(m, n)(m,n),求从strsstrsstrs中选出来
2021-10-06 12:24:21
166
原创 560. 和为K的子数组
560. 和为K的子数组560. 和为K的子数组思路1 暴力求解确定区间 [i,j][i, j][i,j],求改区间的和,如果区间的和等于 KKK,那么次数加一,显然,该算法的时间复杂度为 O(n3)O(n^3)O(n3)。会超时。思路2 暴力求解的改进事实上,我们可以在 O(1)O(1)O(1) 的时间内求出区间 [i,j][i, j][i,j] 的和。一种方式是使用数组存放 numsnumsnums 数组的前缀和,即该数组为 SSS, 那么区间 [i,j][i, j][i,j]的和为 S[j
2021-10-05 11:01:37
178
原创 1074. 元素和为目标值的子矩阵数量
1074. 元素和为目标值的子矩阵数量1074. 元素和为目标值的子矩阵数量我的思路暴力枚举确定矩形的四个边界:top,bottom,left,righttop, bottom, left, righttop,bottom,left,right, 求该区域内数字的和 sumsumsum,判断 sumsumsum 和 targettargettarget 的关系。显然,该算法的时间复杂度为:O(n4⋅n2)O(n^4 \cdot n^2)O(n4⋅n2),确定四个边界需要 O(n4)O(n^4)O(
2021-10-05 10:57:13
143
原创 371. 两整数之和
371. 两整数之和371. 两整数之和我的思路既然无法用加法,那么是不是可以用汇编add(笑)?class Solution {public: int getSum(int a, int b) { __asm { mov eax, a mov ebx, b add eax, ebx mov a, eax };
2021-09-27 10:33:38
85
原创 162. 寻找峰值
162. 寻找峰值162. 寻找峰值我的思路想了半天的 O(logn)O(logn)O(logn) 的解题方案。没想出来。一看数据范围不大。先写一个 O(n)O(n)O(n) 的吧。从开始位置一直向后寻找,直到不满足严格单调增的条件时停止。AC代码:class Solution {public: int findPeakElement(vector<int>& nums) { int n = nums.size(); int index
2021-09-16 11:57:25
237
原创 502. IPO
502. IPO502. IPO我的思路搜索定义函数int dfs(int k, int w, vector<int>& profits, vector<int>& capital):k是剩余可用项目个数。w是起始资金。profits是利润数组capital是启动资金数组dfs返回值的含义是我们可以通过起始资金w获得的最大收益。显然,最终的返回值是:return dfs(k, w, profits, capital) + w;由于一个项目最多
2021-09-09 13:30:51
104
原创 unordered_map 自定义key和value
unordered_map位于头文件<unordered_map>unordered_map的定义template< class Key, class T, class Hash = std::hash<Key>, class KeyEqual = std::equal_to<Key>, class Allocator = std::allocator< std::pair<const Key, T>
2021-09-09 13:00:00
1406
原创 矩阵快速幂
矩阵快速幂快速幂求 ana^nan.显然,一种朴素的方法是:循环 nnn 次,将结果累乘,时间复杂度是 O(n)O(n)O(n) 。可以考虑将 nnn 表示成二进制的形式:n=a0⋅20+a1⋅21+…an−1⋅2n−1+an⋅2n,ai∈{0,1}n = a_0\cdot 2^0 + a_1\cdot 2^1 + \ldots a_{n-1}\cdot 2^{n-1} + a_n\cdot 2^n, a_i\in\{0, 1\}n=a0⋅20+a1⋅21+…an−1⋅2n−1+an⋅2n
2021-08-20 09:55:03
174
1
原创 1190. 反转每对括号间的子串
1190. 反转每对括号间的子串1190. 反转每对括号间的子串我的思路使用 栈 , 从前向后遍历,如果遇到 ) 就将栈中字符取出直到栈空或者遇到 ( ,如果遇到非 ) ,那么将其压栈。AC代码如下:class Solution {public: string reverseParentheses(string s) { stack<char> sta; for (auto item : s){ if (item ==
2021-05-26 20:41:08
127
原创 810. 黑板异或游戏
810. 黑板异或游戏数学时刻提醒我们:保持谦逊!我的思路想了半天,完全没思路。但是我知道,这题一定代码简单,因为一定存在先手必胜的条件。博弈的整体思路经验:奇偶性推导先手必胜条件,或者后手必败条件。数学之美Reference :【宫水三叶の相信科学系列】应用「博弈论」分析「先手必胜态」序列具有何种性质黑板异或游戏Alice 和 Bob 都是聪明的人。下面,分析 Alice 必胜的条件。当初始数组 numsnumsnums 中的所有数字的异或和为 0 时,Alice
2021-05-22 21:28:19
178
1
原创 88. 合并两个有序数组
88. 合并两个有序数组LeetCode题目:88. 合并两个有序数组本题其实并不想写题解的,但是本题的空间优化又让我感到奇妙无比。我的思路创建一个新的数组tmp,用于存放nums1中的元素。然后对tmp和nums2进行 归并排序 中的 合并,将排序结果放入nums1中即可。AC代码:class Solution {public: void merge(vector<int>& nums1, int m, vector<int>& nums2,
2021-04-05 14:48:04
141
原创 1143. 最长公共子序列
1143. 最长公共子序列LeetCode题目:1143. 最长公共子序列我的思路字符串 + 最优解,显然这是一道 动态规划 的题目。立即使用 三板斧 :定义数组:f[i][j]f[i][j]f[i][j]表示字符串text1text1text1的子串text1[0:i]text1[0:i]text1[0:i]和字符串text2text2text2的子串text2[0:j]text2[0:j]text2[0:j]的最长公共子序列的长度。显然,最终的结果就是f[text1.size()−1
2021-04-03 22:34:45
102
原创 1006. 笨阶乘
1006. 笨阶乘LeetCode题目:1006. 笨阶乘我的思路1举个????,对于N=10N=10N=10,结果是121212,计算顺序如下:12=10∗9/8+7−6∗5/4+3−2∗112 = 10 * 9 / 8 + 7 - 6 * 5 / 4 + 3 - 2 * 112=10∗9/8+7−6∗5/4+3−2∗1显然,可以四个一组,将数字1~10分为(10,9,8,7),(6,5,4,3),(2,1)三组。对于前面的个数为4的组,显然,可以直接运算。对于最后一组,特殊处理即可。注意,任
2021-04-01 16:58:40
105
原创 743. 网络延迟时间
743. 网络延迟时间LeetCode题目:743. 网络延迟时间我的思路显然,这是一道求 单源最短路最长 的题目。并且这是一个正权图(0≤wi≤1000 \le w_i \le 1000≤wi≤100)。因此,dijkstra + priority_queue 是解题之道。如果对最短路算法存疑,可以参考博客:最短路不妨使用 链式前向星 存储图。如果对这种存储方式有问题可以参考博客:图的存储根据上面的思路可以写出AC代码:class Solution {public:
2021-03-27 20:44:25
157
原创 最短路
最短路Reference:最短路注意,下面的所有算法的存储方式都是使用了vector的方式,如果对存储方式有问题,请看我的另一篇博客:图的存储。Bellman-Ford基于 松弛(relax) 操作。设起始节点为SSS。定义dist(u)dist(u)dist(u)为SSS到当前节点uuu的最短路径长度。松弛操作relax(u,v)relax(u,v)relax(u,v)是指:dist(v)=min{dist(v),dist(u)+edge_len(u,v)}dist(v) = min\
2021-03-27 18:16:18
195
原创 图的存储
图的存储邻接矩阵略邻接表略链式前向星数据结构:const int MAX_EDGE_SCALE = 1000; // 边的规模const int MAX_VERTEX_SCALE = 1000; // 顶点的规模struct Edge{ int v; // 边(u, v) int w; // 权重 int next; // 下一条边的编号}; vector<Edge> edge(MAX_EDGE_SCALE); // 存储边int
2021-03-27 18:10:41
158
原创 POJ-3250 Bad Hair Day
POJ-3250 Bad Hair Day题目链接:POJ-3250 Bad Hair Day题目大意有 NNN 头牛从左到右排成一排,每一头牛都有一个高度 hih_ihi ,设左数第 iii 头牛与它右边第一头高度 ≥hi\ge h_i≥hi 的牛之间有 cic_ici 头牛,求 ∑i=1Nci\sum_{i=1}^Nc_i∑i=1Nci .思路1:暴力对于每一头牛iii,找到其右边的比它高的牛jjj,然后将j−ij-ij−i求和即可。复杂度分析:时间复杂度:O(n2)O(..
2021-03-25 23:20:14
169
原创 82. 删除排序链表中的重复元素 II
82. 删除排序链表中的重复元素 IILeetCode题目:82. 删除排序链表中的重复元素 II思路1:模拟设置三个指针如下: pre ↓ 1->2->3->3->3->3->4->4->5 ↑ ↑ ppre curppre指针:指向已经完成遍历的链表的最后一个元素。pre指针:指向ppre的下一个元素。cur指针:从pre->next开始,判断cur->val是否和p
2021-03-25 23:13:07
116
原创 191. 位1的个数
191. 位1的个数LeetCode:191. 位1的个数我的思路每次取n的最低位,如果是1,则结果加 1 ;然后n右移 1 位,直到n等于 0 .取出数字 a 的最低位:a & 1。根据上述思路,很容易写出AC代码:class Solution {public: int hammingWeight(uint32_t n) { int ret = 0; while (n){ if (n & 1){ .
2021-03-22 23:43:15
81
原创 73. 矩阵置零
73. 矩阵置零LeetCode题目:73. 矩阵置零我的思路开辟两个数组 row 和 col ,分别存储 matrix 中 0 的位置的行坐标和列坐标。然后根据 row 和 col 修改 matrix 即可。根据上述思路,可以写出AC代码:class Solution {public: int m, n; void setZeroes(vector<vector<int>>& matrix) { vector<int.
2021-03-21 23:41:39
218
原创 92. 反转链表 II
92. 反转链表 IILeetCode题目:92. 反转链表 II我的思路把大象放进冰箱需要三步:1.打开冰箱;2.放入大象;3.关闭冰箱。同样,反转链表也需要三步:1.找到需要反转的区间;2.反转该区间;3.将该区间放回原位。开辟一个vector<ListNode *> tmp,存放该链表,然后反转tmp[left:right],最后,将tmp中的元素 连 起来,返回tmp[0]。根据上述思路,写出AC代码:class Solution {public: .
2021-03-18 23:34:06
153
原创 115. 不同的子序列
115. 不同的子序列LeetCode题目:115. 不同的子序列我的思路字符串 + 出现个数,显然这极大可能是一个 动态规划 的题目。1.确定数组f的含义和结构。显然,s的长度和t的长度均会对最终的结果造成影响。设f[i][j]的含义是:字符串s[0:i]和字符串t[0:j],s[0:i]的子序列中t[0:j]出现的个数。那么,最终的结果就是f[s.size()-1][t.size()-1].2.确定转移状态。我们应该如何求解f[i][j]?假设 s=“babgbag.
2021-03-17 17:16:35
344
原创 54. 螺旋矩阵
54. 螺旋矩阵LeetCode题目:54. 螺旋矩阵我的思路定义:vector<vector<bool>> vis表示当前位置是否被访问过。(py, px)代表当前元素所在的(行号,列号)。direction代表当前的方向,并规定:上:0右:1下:2左:3flag表示当前完成访问的个数。根据上述定义,可以写出AC代码:class Solution {public: vector<int> ret; int m.
2021-03-16 00:14:08
155
原创 331. 验证二叉树的前序序列化
331. 验证二叉树的前序序列化LeerCode题目:331. 验证二叉树的前序序列化我的思路思考了一小会儿,感觉头绪很乱。想用栈,可是没想出来怎么用。昨晚失眠到凌晨四点半,整天不在状态。于是直接看了题解。发现了几种 有趣 的解法。解法一:前序遍历建树题目要求不让建树,但是可以模拟建树的过程,我们不真正建树,而是模拟前序建立二叉树的过程。我们分析如下树: 1 / \ 2 3 /\ /\ .
2021-03-12 23:46:15
199
原创 227. 基本计算器 II
227. 基本计算器 IILeetCode题目:227. 基本计算器 II思路分析题目大意:给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分。有几个注意点:运算符有+ - * /,其中/是整除。没有负数。数字的范围是整型。刚开始想用 栈 ,在写代码的过程中发现了一种自认为 优美 的解题方法。具体想法如下。比如,计算s = "3+2*2",显然应该优先计算2*2,一种通俗的思路是:先算乘除,再算加减 。如果我们算完乘除,那么s.
2021-03-11 23:59:18
161
原创 224. 基本计算器
224. 基本计算器LeetCode题目:224. 基本计算器思路分析题目大意是给你一个简单字符串s,计算其值。有几个注意点:运算符只有+ - ( )。字符串s中有空格。没说数字是个位数,也就是1+123这样的表达式是合法的。可能存在 负数 ,也就是-2+1这样的表达式是合法的。刚开始审题不认真,想用以前本科时期学习时用的 栈 + 逆波兰表达式 。其实注意到了上面的几个注意点就好写了。我的解题方法首先,对字符串进行预处理:1.去除所有空格2.将字符.
2021-03-10 23:20:36
131
原创 1047. 删除字符串中的所有相邻重复项
1047. 删除字符串中的所有相邻重复项LeetCode题目:1047. 删除字符串中的所有相邻重复项我的思路刚开始,发现只要去除字符串中的 元素个数为偶数的回文串 即可。写了一些代码后发现写不下去了,因为时间复杂度写的有点高了。然后想,直接模拟过程即可,写了一段代码,突然来思路了:消去 + 匹配 ,这不是 括号匹配问题 么?用 栈 ,完美解决:对于当前字符S[i],如果S[i] == stack.top(),那么将栈顶元素弹出,解决S[i+1];如果S[i] != stack.to.
2021-03-09 13:15:14
133
原创 132. 分割回文串 II
132. 分割回文串 IILeetCode题目:132. 分割回文串 II我的思路题目含义:给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。返回符合要求的 最少分割次数 。这题不同于 131. 分割回文串 ,显然,本题只需要求解 最少分割次数 ,加上本题是 字符串题目 ,因此,本题极有可能是使用 动态规划 解决。动态规划的方程我没想出来,数组的定义方式也没想出来。其实,想复杂了,我一直将数组定义为f[i][j]。一维数组即可解决。实在写不出来了,想到.
2021-03-08 22:49:16
82
原创 131. 分割回文串
131. 分割回文串LeetCode题目:131. 分割回文串思路分析题目含义:给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。要找到所有可能的分割方案,显然这是一道 搜索题,可能还要用到 记忆化 搜索,可能还需要 剪枝 。设dfs(pos)是用于搜索的函数,其中pos是搜索到的位置。假设当前搜到了 s 的第i个元素,且s[0:i-1]已经被拆分成若干个回文串了。此时,我们需要确定往前走几步(即确定从当前位置i到其后位置j),这.
2021-03-07 23:30:03
164
原创 503.下一个更大元素 Ⅱ
503.下一个更大元素 ⅡLeetCode题目:503.下一个更大元素 Ⅱ思路分析题目大意:在循环数组中,寻找当前数字nums[i]的下一个比他大的数字。我的思路:朴素想法:遍历数组中每一个元素nums[i],再使用一层循环寻找比nums[i]大的那个数字nums[j]。可以将nums数组中的数字 重复一遍 以减少其他操作。时间复杂度:O(n^2)。为了减少时间复杂度。我想,可以寻找严格单调递减区间。比如栗子,5 2 1 6,严格单调减区间是5 2 1,那么5 2 1的数字都.
2021-03-06 22:25:49
79
原创 O(n)的时间复杂度求中位数
O(n)的时间复杂度求中位数O(n)中位数问题是指:在O(n)的时间复杂度内找到一个无序序列的中位数。在开始O(n)时间复杂度求中位数之前,先手写一下快速排序。快速排序的实现Reference:快速排序|菜鸟教程白话经典算法系列之六 快速排序 快速搞定快速排序的原理如果想正序排序一个序列:从序列中找到一个 基准数 。分区:将序列中比基准数大的数字都放到基准数的右边,将序列中比基准数小的数字都放在基准数的左边。此时,序列被分成了三部分: 左序列 + 基准数 + 右序列。实现2的方.
2020-09-26 14:45:14
12530
2
原创 全排列问题
全排列问题问题:如何获得给定集合的全排列。下面介绍两种解决方式。1. 无重复集合的全排列问题:求"qwe"的全排列。显然,问题的答案是:“qwe”,“qew”,“eqw”,“ewq”,“wqe”,“weq”,共A(3,3)=6种。一种朴素的解决方式如下:对于串S,如果处理其区间[l,r]之间的字符的全排列,可以先固定S[l],然后求串S区间[l+1,r]之间字符的全排列。S[l]可以等于区间[l,r]之间的所有字符。根据上述想法,可以写出如下代码:#inclu
2020-09-11 20:20:09
236
原创 第30天 高级的应用程序
第30天 高级的应用程序2020.5.121. 命令行计算器(harib27a)编写代码cal.c:……此代码略长,且不是编写OS的重点,因此此处不再罗列代码。可以使用的运算符:+:加法运算-:减法运算*:乘法运算/:整除%:取余&:按位与|:按位或^:异或~:按位取反<<:左移>>:右移():括号运算结同时显示十进制和十六进制。只能进行整数运算。计算优先级和C语言的规定相同。可以直接使用16进制数字,只要在16进制.
2020-05-13 11:25:15
272
原创 第29天 压缩与简单的应用程序
第29天 压缩与简单的应用程序2020.5.101. 修复bug(harib26a)先修复harib25g中的bug。通过观察,发现harib25g中,只有全角字符的显示有问题,半角字符是正常的,而且移动窗口之后可以恢复正常,这说明图层缓冲区中是有数据的。因此,问题极有可能出现在刷新上面。修改putfont8_asc_sht(window.c):void putfonts8_asc_sht(struct SHEET *sht, int x, int y, int c, int b,.
2020-05-12 15:50:25
351
原创 第28天 文件操作与文字显示
第28天 文件操作与文字显示2020.5.81. alloca(1)(harib25a)编写一个求素数的应用程序sosu.c:#include <stdio.h>#include "apilib.h"#define MAX 1000void HariMain(void){ char flag[MAX], s[8]; int i, j; for (i = 0; i < MAX; i++) { flag[i] = 0; .
2020-05-10 16:59:32
562
原创 第27天 LDT与库
第27天 LDT与库2020.5.71. 先来修复bug(harib24a)在harib23j中有一个bug,就是用ncst运行的应用程序,使用Shift+F1和点击“X”按钮都无法关闭窗口。其实这个bug在很久之前就有了,只是一直没有发现而已。修改HariMain:void HariMain(void){ …… for (;;) { …...
2020-05-07 23:50:47
423
原创 第26天 为窗口移动提速
第26天 为窗口移动提速2020.5.21. 提高窗口移动速度(1)(harib23a)本着优化用户体验的宗旨,修改代码以提高窗口移动速度。导致窗口移动相对缓慢的原因其中之一是:sheet_refreshmap的速度太慢。sheet_refreshmap在sheet_slide中被调用了2次,如果能够提高sheet_refreshmap的速度,那么就能显著提高窗口移动的速度。...
2020-05-05 11:46:18
288
原创 第25天 增加命令行窗口
第25天 增加命令行窗口2020.4.301. 蜂鸣器发声(harib22a)蜂鸣器和定时器一样,都是由PIT来控制的,而PIT位于芯片组中,因此所有型号的电脑都能使用它。关于蜂鸣器的相关资料:其中,赫兹大小 = 1.19318MHz / 设定值。PIT时钟频率与CPU时钟频率无关,PIT时钟频率大小恒定为1.19318MHz。设计蜂鸣器发声的API:EDX ...
2020-05-02 14:43:29
386
原创 第24天 窗口操作
第24天 窗口操作2020.4.291. 窗口切换(1)(harib21a)实现能够切换窗口顺序的功能,首先实现从键盘切换的方法:当按下F11时,将最下面的窗口放到最上面。F11的按键编码是0x57,F12的按键编码是0x58。修改HariMain:void HariMain(void){ …… for (;;) { …… ...
2020-04-30 15:01:52
265
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人