算法(UVa + LeetCode + OJ + ……)
文章平均质量分 57
aift
不破楼兰终不还!
展开
-
[LeetCode] 450、删除二叉搜索树中的节点
题目描述给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点可分为两个步骤:首先找到需要删除的节点;如果找到了,删除它。说明: 要求算法时间复杂度为 O(h),h 为树的高度。root = [5,3,6,2,4,null,7]key = 3 5 / \ 3 6 / \ \2 4 7给定需要删除的节点值是 3,所以原创 2020-09-27 15:41:47 · 441 阅读 · 0 评论 -
[LeetCode] 470、用 Rand7() 实现 Rand10()
已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 10 范围内的均匀随机整数。不要使用系统的 Math.random() 方法。// The rand7() API is already defined for you.// int rand7();// @return a random integer in the range 1 to 7class Solution {public: int rand10() {原创 2020-09-11 19:52:36 · 310 阅读 · 1 评论 -
背包问题
题目链接0/1背包暴力解法#include<bits/stdc++.h>using namespace std;int main(){ int N, V; cin >> N >> V; int v[N], w[N]; vector<vector<int> > dp(N+1, vector<int>(V+1, 0)); for(int i = 0; i < N; i++)原创 2020-09-11 19:51:57 · 266 阅读 · 0 评论 -
[LeetCode] 109、有序链表转换二叉搜索树
简单题,注意递归写法不要忘记写递归出口,还有就是前后部分断链class Solution {public: TreeNode* sortedListToBST(ListNode* head) { // 递归别忘记写递归出口 if(head == nullptr) return nullptr; if(head->next == nullptr) return new TreeNode(head-原创 2020-08-27 01:15:06 · 184 阅读 · 0 评论 -
面试题 16.11. 跳水板
题目描述你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为shorter,长度较长的木板长度为longer。你必须正好使用k块木板。编写一个方法,生成跳水板所有可能的长度。返回的长度需要从小到大排列。输入:shorter = 1longer = 2k = 3输出: {3,4,5,6}解题思路这个题不是 DP 或者是 DFS 什么的。看给出的 k 的范围是 100000,我们知道需要用 O(n) 的解法。因此需要找规律了。两个特例:k == 0,这个时候返回 []原创 2020-07-08 13:33:13 · 490 阅读 · 0 评论 -
[LeetCode] 974、和可被 K 整除的子数组
题目描述给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续、非空)子数组的数目。输入:A = [4,5,0,-2,-3,1], K = 5输出:7解释:有 7 个子数组满足其元素之和可被 K = 5 整除:[4, 5, 0, -2, -3, 1], [5], [5, 0], [5, 0, -2, -3], [0], [0, -2, -3], [-2, -3]解题思路第一反应是用“前缀和”的思路,但是上手的时候还是有点不知所措,原因是之前不知道本题的关键是需要对负数进行同余预处理(原创 2020-05-27 17:51:54 · 256 阅读 · 1 评论 -
[LeetCode] 983、最低票价
题目描述在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行。在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出。每一项是一个从 1 到 365 的整数。其中,火车票有三种不同的销售方式:一张为期一天的通行证售价为 costs[0] 美元;一张为期七天的通行证售价为 costs[1] 美元;一张为期三十天的通行证售价为 costs[2] 美元。通行证允许数天无限制的旅行。 例如,如果我们在第 2 天获得一张为期 7 天的通行证,那么我们可以连着旅行 7 天:第 2 天、第原创 2020-05-25 00:00:11 · 474 阅读 · 0 评论 -
[LeetCode] 1095、山脉数组中查找目标值
题目描述给你一个 山脉数组 mountainArr,请你返回能够使得 mountainArr.get(index) 等于 target 的最小 的下标 index 的值。如果不存在这样的下标 index,就请返回 -1。何为山脉数组?如果数组 A 是一个山脉数组的话,那它满足如下条件:首先,A.length >= 3其次,在 0 < i < A.length - 1 条件下,存在 i 使得:A[0] < A[1] < ... A[i-1] < A[i]A[i原创 2020-05-24 22:43:00 · 349 阅读 · 0 评论 -
[LeetCode] 542、01 矩阵
题目描述给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。两个相邻元素间的距离为 1 。输入:0 0 00 1 01 1 1输出:0 0 00 1 01 2 1解题思路看到找最短距离 => BFS。广度优先搜索:(相似题目:[LeetCode] 1162、地图分析)首先把每个源点 000 入队,然后从各个 000 同时开始一圈一圈的向 111 扩散(每个 111 都是被离它最近的 000 扩散到的),扩散的时候可以设置 int[][] dist 来原创 2020-05-24 22:00:53 · 361 阅读 · 1 评论 -
[LeetCode] 1248、 统计「优美子数组」
题目描述给你一个整数数组 nums 和一个整数 k。如果某个 连续 子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」。请返回这个数组中「优美子数组」的数目。输入:nums = [2,2,2,1,2,2,1,2,2,2], k = 2输出:16解题思路自己的第一反应是用“滑动窗口”的解法,但是没想清楚怎么弄,还是欠火候啊。。。滑动窗口(O(n)+O(1)O(n) + O(1)O(n)+O(1),推荐!):不断右移 right 指针来扩大滑动窗口,使其包含 k 个奇数;原创 2020-05-24 21:33:02 · 376 阅读 · 0 评论 -
[LeetCode] 680、验证回文字符串 Ⅱ
题目描述给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。输入: "abca"输出: True解释: 你可以删除c字符。参考代码简单题class Solution {public: bool validPalindrome(string str) { int left = 0, right = str.size() - 1; while(left < right){ if(str[left] == st原创 2020-05-24 20:33:14 · 322 阅读 · 0 评论 -
Kaggle——ASHRAE 能源消耗预测,排名1%
这是在2019年11~12月期间,我参加的一个kaggle比赛——ASHRAE - Great Energy Predictor III最终成绩:排名前1%,22/3614。差一点点就金牌了,感觉前面的名次每前进一名都跟炼丹似的,有一定运气成分。。。。难搞哦。比赛的具体要求我就不详细介绍了,直接去比赛官网看就好。我当时自己整理了notebook,记录了当时自己的解决方案,但是不好分享,关键...原创 2020-05-05 15:36:39 · 4380 阅读 · 10 评论 -
[LeetCode] 460、LFU缓存
题目描述请你为 最不经常使用(LFU)缓存算法设计并实现数据结构。它应该支持以下操作:get 和 put。// 在此问题中,当存在平局(即两个或更多个键具有相同使用频率)时,应该去除 最近 最少使用的键。LFUCache cache = new LFUCache( 2 /* capacity (缓存容量) */ );cache.put(1, 1);cache.put(2, 2);ca...原创 2020-04-06 01:08:18 · 304 阅读 · 0 评论 -
[LeetCode] 1111、有效括号的嵌套深度
题目描述有效括号字符串类型与对应的嵌套深度计算方法如下图所示:给你一个「有效括号字符串」 seq,请你将其分成两个不相交的有效括号字符串,A 和 B,并使这两个字符串的深度最小。不相交:每个 seq[i] 只能分给 A 和 B 二者中的一个,不能既属于 A 也属于 B 。A 或 B 中的元素在原字符串中可以不连续。A.length + B.length = seq.length深度...原创 2020-04-03 14:56:09 · 269 阅读 · 0 评论 -
[LeetCode] 820、单词的压缩编码
题目描述给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A。例如,如果这个列表是 ["time", "me", "bell"],我们就可以将其表示为 S = "time#bell#" 和 indexes = [0, 2, 5]。对于每一个索引,我们可以通过从字符串 S 中索引的位置开始读取字符串,直到 “#” 结束,来恢复我们之前的单词列表。那么成功对给定单词列表进行编...原创 2020-03-29 12:02:43 · 250 阅读 · 0 评论 -
[LeetCode] 914、卡牌分组
题目描述给定一副牌,每张牌上都写着一个整数。此时,你需要选定一个数字 X,使我们可以将整副牌按下述规则分成 1 组或更多组:每组都有 X 张牌。组内所有的牌上都写着相同的整数。仅当你可选的 X >= 2 时返回 true。输入:[1,2,3,4,4,3,2,1]输出:true解释:可行的分组是 [1,1],[2,2],[3,3],[4,4]解题思路读题知: 每种数字的...原创 2020-03-27 14:21:22 · 157 阅读 · 0 评论 -
[LeetCode] 999、车的可用捕获量
题目描述在一个 8 x 8 的棋盘上,有一个白色车(rook)。也可能有空方块,白色的象(bishop)和黑色的卒(pawn)。它们分别以字符 “R”,“.”,“B” 和 “p” 给出。大写字符表示白棋,小写字符表示黑棋。车按国际象棋中的规则移动:它选择四个基本方向中的一个(北,东,西和南),然后朝那个方向移动,直到它选择停止、到达棋盘的边缘或移动到同一方格来捕获该方格上颜色相反的卒。另外,车不...原创 2020-03-26 10:41:59 · 175 阅读 · 0 评论 -
[LeetCode] 892、三维形体的表面积
题目描述在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体。每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i, j) 上。请你返回最终形体的表面积。输入:[[1,2],[3,4]]输出:34解题思路关键是要先理解题意。首先,一个柱体一个柱体的看,每个柱体是由:2个底面(上表面/下表面)+ 所有的正方体都贡献了4个侧表面积。然后,把柱体贴...原创 2020-03-25 11:51:34 · 255 阅读 · 0 评论 -
[LeetCode] 876、链表的中间结点
题目描述给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。输入:[1,2,3,4,5,6]输出:此列表中的结点 4 (序列化形式:[4,5,6])解题思路快慢指针,简单题。补充:链表类经典题目。参考代码class Solution {public: ListNode* middleNode(ListNode* he...原创 2020-03-23 14:38:25 · 133 阅读 · 0 评论 -
[LeetCode] 945、使数组唯一的最小增量
题目描述给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1。返回使 A 中的每个值都是唯一的最少操作次数。输入:[3,2,1,2,1,7]输出:6解释:经过 6 次 move 操作,数组将变为 [3, 4, 1, 2, 5, 7]。可以看出 5 次或 5 次以下的 move 操作是不能让数组的每个值唯一的。解题思路主要有两种思路。我的实现。排序(O(...原创 2020-03-22 22:37:01 · 195 阅读 · 0 评论 -
[LeetCode] 365、水壶问题
题目描述有两个容量分别为 x升 和 y升 的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水?如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水。你允许:装满任意一个水壶;清空任意一个水壶;从一个水壶向另外一个水壶倒水,直到装满或者倒空;输入: x = 3, y = 5, z = 4输出: True解题思路纯数学解法比较难搞,这是一个...原创 2020-03-21 22:41:40 · 673 阅读 · 0 评论 -
[LeetCode] 409、最长回文串
题目描述给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。输入: "abccccdd"输出: 7解释: 我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。解题思路回文子串问题一般是用“动态规划”或者“中心拓展法”解决,但是这个题有点区别:本题不需要考虑原来字符串中字符的...原创 2020-03-19 11:42:24 · 165 阅读 · 0 评论 -
[LeetCode] 836、矩形重叠
题目描述矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标。给出两个矩形,判断它们是否重叠并返回结果。输入:rec1 = [0,0,2,2], rec2 = [1,1,3,3]输出:true解题思路简单题。相似题目:[LeetCode] 223、矩形面积。参考代码class Solution {pub...原创 2020-03-18 23:26:55 · 138 阅读 · 0 评论 -
[LeetCode] 1071、字符串的最大公因子
题目描述对于字符串 S 和 T,只有在 S = T + ... + T(T 与自身连接 1 次或多次)时,我们才认定 “T 能除尽 S”。返回最长字符串 X,要求满足 X 能除尽 str1 且 X 能除尽 str2。输入:str1 = "ABCABC", str2 = "ABC"输出:"ABC"解题思路这个题思路太巧妙,解题方法是“辗转相除法gcd”。我的实现。辗转相除法:看到...原创 2020-03-12 17:14:53 · 276 阅读 · 0 评论 -
[LeetCode] 1013、将数组分成和相等的三个部分
题目描述给你一个整数数组 A,只有可以将其划分为三个和相等的非空部分时才返回 true,否则返回 false。输出:[0,2,1,-6,6,-7,9,1,2,0,1]输出:true解释:0 + 2 + 1 = -6 + 6 - 7 + 9 + 1 = 2 + 0 + 1解题思路此题最简单的思路就是从头直接开始找,比较暴力,但是时间复杂度也是O(n)O(n)O(n)。用双指针的思路理论...原创 2020-03-11 23:45:12 · 193 阅读 · 0 评论 -
[LeetCode] 1103、分糖果 II
题目描述我们买了一些糖果 candies,打算把它们分给排好队的 **n = num_people**个小朋友。给第一个小朋友 1 颗糖果,第二个小朋友 2 颗,依此类推,直到给最后一个小朋友 n 颗糖果。然后,我们再回到队伍的起点,给第一个小朋友 n + 1 颗糖果,第二个小朋友 n + 2 颗,依此类推,直到给最后一个小朋友 2 * n 颗糖果。以此类推。返回一个长度为 num_people...原创 2020-03-05 23:05:55 · 211 阅读 · 0 评论 -
[LeetCode] 575、分糖果
题目描述给定一个偶数长度的数组,其中不同的数字代表着不同种类的糖果,每一个数字代表一个糖果。你需要把这些糖果平均分给一个弟弟和一个妹妹。返回妹妹可以获得的最大糖果的种类数。输入: candies = [1,1,2,2,3,3]输出: 3解析: 一共有三种种类的糖果,每一种都有两个。 最优分配方案:妹妹获得[1,2,3],弟弟也获得[1,2,3]。这样使妹妹获得糖果的种类数最多。...原创 2020-03-05 22:37:44 · 192 阅读 · 0 评论 -
[LeetCode] 994、腐烂的橘子
题目描述每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。(0是空单元,1是新鲜橘子,2是腐烂橘子)输入:[[2,1,1],[1,1,0],[0,1,1]]输出:4解题思路经典的bfs。参考代码class Solution {public: int orangesRott...原创 2020-03-04 11:54:03 · 141 阅读 · 0 评论 -
[LeetCode] 572、另一个树的子树
题目描给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。给定的树 s: 3 / \ 4 5 / \ 1 2 / 0给定的树 t: 4 / \ 1 2返回 false。解题思路与《剑指offe...原创 2020-02-20 13:02:27 · 175 阅读 · 0 评论 -
[LeetCode] 641、设计循环双端队列
题目描述设计循环双端队列。解题思路这道题的前导问题是「力扣」第 622 题:设计循环队列。在实现上几乎是一模一样的,要注意的地方有:数组实现循环双端队列:在数组里的操作,我们参考“动态数组”的实现来完成,主要是为了让每一步的操作复杂度都最低。只不过不要求我们实现动态扩容与缩容。本题我们需要注意的地方有:定义循环变量 front 和 rear 。一直保持这个定义,到底是先赋值还是...原创 2020-02-16 00:49:11 · 286 阅读 · 0 评论 -
[LeetCode] 622、设计循环队列
题目描述设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。解题思路这道题说“循环”的意思是要求...原创 2020-02-16 00:21:50 · 180 阅读 · 0 评论 -
[LeetCode] 400、第N个数字
题目描述在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, …中找到第 n 个数字。输入: 11输出: 0说明: 第11个数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是0,它是10的一部分。解题思路《剑指offer》第44题,这个题的本质就是个数学题,举个例子仔细分析规律即可。参考代码// 本质就...原创 2020-02-15 15:59:12 · 188 阅读 · 0 评论 -
[LeetCode] 113、路径总和 II
题目描述给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。示例:给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 ...原创 2020-02-14 23:30:20 · 125 阅读 · 0 评论 -
[LeetCode] 946、验证栈序列
题目描述给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false 。输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]输出:true解题思路考察堆栈,那么就用堆栈模拟咯。(借用“辅助栈”)我的实现// 考...原创 2020-02-14 22:44:55 · 168 阅读 · 0 评论 -
[LeetCode] 65、有效数字
题目描述验证给定的字符串是否可以解释为十进制数字。"1 a"` => `false``"2e10"` => `true``" -90e3 "` => `true解题思路《剑指offer》第20题。注意:(我的实现)小数点前面可以没有数字、小数点后面可以没有数字、小数点前面和后面可以都有数字。 => ||当eee或EEE前面没有数字时,整个字符串不能表示...原创 2020-02-14 21:41:11 · 139 阅读 · 0 评论 -
[LeetCode] 343、整数拆分
题目描述给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。输入: 10输出: 36解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。参考代码和《剑指offer》第14题一样。动态规划class Solution {public: int integerBreak(int n) { ...原创 2020-02-14 20:11:56 · 211 阅读 · 0 评论 -
LeetCode专题 ——《程序员面试金典》
文章目录下面只给出答案,具体题目请参考:LeetCode专题 ——《程序员面试金典》原创 2020-02-14 13:15:19 · 1387 阅读 · 0 评论 -
LeetCode专题 ——《剑指offer》
文章目录[面试题03. 数组中重复的数字](https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof)[面试题04. 二维数组中的查找](https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof)[面试题05. 替换空格](https:...原创 2020-02-12 21:24:50 · 1799 阅读 · 0 评论 -
[LeetCode] 80、删除排序数组中的重复项 II
题目描述给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。给定 nums = [1,1,1,2,2,3],函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。你不需要考虑数组中超出新长度后面的元素。解题思路双指针解决,利用好“排序数组”的特点。相似题目:[LeetCode] 26、删...原创 2020-02-09 22:38:56 · 109 阅读 · 0 评论 -
[LeetCode] 518、零钱兑换 II
题目描述给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。输入: amount = 5, coins = [1, 2, 5]输出: 4解释: 有四种方式可以凑成总金额:5=55=2+2+15=2+1+1+15=1+1+1+1+1解题思路我们不能直接用第377题的代码,因为第377题处规定:顺序不同的序列被视作不同的组合。而...原创 2020-02-09 22:17:08 · 328 阅读 · 0 评论