LeetCode算法
文章平均质量分 96
算法强者,慢慢修成
浪子花梦
江苏淮安人,二十有三,偶然得知编程二字,至此五年有余,日渐憔悴。
展开
-
算法训练之路汇总(持续更新中. . .)
LeetCodeLeetCode算法 —— 无重复字符的最长子串(队列思想)LeetCode算法 —— 两数相加之链表的灵活使用LeetCode算法 —— 寻找两个正序数组的中位数LeetCode算法 —— 最长回文子串(队列思想)LeetCode算法 —— Z 字形变换LeetCode算法 —— 整数反转LeetCode算法 —— 字符串转换整数(atoi)LeetCode算法 —— 正则表达式匹配(详解官方递归思想)LeetCode算法 —— 正则表达式匹配(详解官方动态规划思想)L原创 2020-07-17 10:49:30 · 1375 阅读 · 3 评论 -
LeetCode算法 —— 插入区间
给出一个无重叠的 ,按照区间起始端点排序的区间列表。在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。示例 1:输入:intervals = [[1,3],[6,9]], newInterval = [2,5]输出:[[1,5],[6,9]]示例 2:输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]输出:[[1,2],[3,10],[12,16]]解释:原创 2020-09-13 23:51:26 · 306 阅读 · 3 评论 -
LeetCode算法 —— 合并区间
给出一个区间的集合,请合并所有重叠的区间。示例 1:输入: intervals = [[1,3],[2,6],[8,10],[15,18]]输出: [[1,6],[8,10],[15,18]]解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].示例?2:输入: intervals = [[1,4],[4,5]]输出: [[1,5]]解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。#include <iostream>#include &l原创 2020-09-13 23:50:48 · 563 阅读 · 0 评论 -
LeetCode算法 —— 跳跃游戏
给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。示例?1:输入: [2,3,1,1,4]输出: true解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。示例?2:输入: [3,2,1,0,4]输出: false解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。#include &原创 2020-09-13 23:50:13 · 339 阅读 · 0 评论 -
LeetCode算法 —— 螺旋矩阵
给定一个包含?m x n?个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。示例?1:输入:[[ 1, 2, 3 ],[ 4, 5, 6 ],[ 7, 8, 9 ]]输出: [1,2,3,6,9,8,7,4,5]示例?2:输入:[[1, 2, 3, 4],[5, 6, 7, 8],[9,10,11,12]]输出: [1,2,3,4,8,12,11,10,9,5,6,7]#include <iostream> #include &l原创 2020-09-13 23:49:39 · 411 阅读 · 0 评论 -
LeetCode算法 —— 最大子序和
贪心给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释:连续子数组?[4,-1,2,1] 的和最大,为?6。#include <iostream> #include <algorithm>#include <vector>using namespace std;// 贪心算法class Solution {public:原创 2020-09-13 23:48:56 · 235 阅读 · 0 评论 -
LeetCode算法 —— N皇后、N皇后II
N皇后n皇后问题研究的是如何将 n?个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。给定一个整数 n,返回所有不同的?n?皇后问题的解决方案。每一种解法包含一个明确的?n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。示例:输入: 4输出: [[".Q…", // 解法 1“…Q”,“Q…”,“…Q.”],["…Q.", // 解法 2“Q…”,“…Q”,“.Q…”]]解释: 4 皇后问题存在两个不同的解法。提示:皇后,是原创 2020-09-13 23:47:31 · 288 阅读 · 0 评论 -
LeetCode算法 —— 字母异位词分组
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。示例:输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]输出:[[“ate”,“eat”,“tea”],[“nat”,“tan”],[“bat”]]说明:所有输入均为小写字母。不考虑答案输出的顺序。#include <iostream>#include <vector>#include <unordered_map>原创 2020-09-13 23:45:40 · 263 阅读 · 0 评论 -
LeetCode算法 —— 旋转图像(翻转后镜像)
题目:给定一个 n × n 的二维矩阵表示一个图像。将图像顺时针旋转 90 度。说明:你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。示例 1:给定 matrix =[[1,2,3],[4,5,6],[7,8,9]],原地旋转输入矩阵,使其变为:[[7,4,1],[8,5,2],[9,6,3]]示例 2:给定 matrix =[[ 5, 1, 9,11],[ 2, 4, 8,10],[13, 3, 6, 7],[15原创 2020-08-08 08:51:37 · 542 阅读 · 0 评论 -
LeetCode算法 —— 全排列、全排列 II
此算法参考如下分析文章:《算法笔记》—— 解决 “排列组合问题” 递归的灵活运用全排列题目:给定一个 没有重复 数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]代码如下所示:#include <iostream>#include <vector>#include <algorithm> using name.原创 2020-08-08 08:49:26 · 440 阅读 · 0 评论 -
LeetCode算法 —— 跳跃游戏 II
题目:给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。示例:输入: [2,3,1,1,4]输出: 2解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。说明:假设你总是可以到达数组的最后一个位置。对 i + nums[i] 进行贪心代码如下所示:#include <iostream>原创 2020-08-08 08:45:48 · 306 阅读 · 0 评论 -
LeetCode算法 —— 通配符匹配
题目:给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 ‘*’ 的通配符匹配。‘?’ 可以匹配任何单个字符。‘*’ 可以匹配任意字符串(包括空字符串)。两个字符串完全匹配才算匹配成功。说明:s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。示例 1:输入:s = “aa”p = “a”输出: false解释: “a” 无法匹配 “aa” 整个字符串。示例 2:输入:s = “aa”p =原创 2020-08-08 08:43:35 · 842 阅读 · 0 评论 -
LeetCode算法 —— 字符串相乘
题目:给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。示例 1:输入: num1 = “2”, num2 = “3”输出: “6”示例 2:输入: num1 = “123”, num2 = “456”输出: “56088”说明:num1 和 num2 的长度小于110。num1 和 num2 只包含数字 0-9。num1 和 num2 均不以零开头,除非是数字 0 本身。不能使用任何标准库的大数类型(比如原创 2020-08-08 08:40:33 · 236 阅读 · 0 评论 -
LeetCode算法 —— 接雨水
题目:给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。示例:输入: [0,1,0,2,1,0,1,3,2,1,2,1]输出: 6双指针计算单柱子:#include <iostream> #include <algorithm>#include原创 2020-08-03 19:57:19 · 388 阅读 · 0 评论 -
LeetCode算法 —— 缺失的第一个正数
题目:给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。示例 1:输入: [1,2,0]输出: 3示例 2:输入: [3,4,-1,1]输出: 2示例 3:输入: [7,8,9,11,12]输出: 1提示:你的算法的时间复杂度应为O(n),并且只能使用常数级别的额外空间。将数组中的元素变化哈希关系:#include <iostream> #include <vector> using namespace std; class S原创 2020-08-03 19:55:04 · 229 阅读 · 0 评论 -
LeetCode算法 —— 组合总和II
题目:给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。说明:所有数字(包括目标数)都是正整数。解集不能包含重复的组合。示例 1:输入: candidates = [10,1,2,7,6,1,5], target = 8,所求解集为:[[1, 7],[1, 2, 5],[2, 6],[1, 1, 6]]示例 2:输入: candi原创 2020-08-03 19:52:33 · 264 阅读 · 0 评论 -
LeetCode算法 —— 组合总和
题目:给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。示例 1:输入:candidates = [2,3,6,7], target = 7,所求解集为:[[7],[2,2,3]]示例 2:输入:candidates = [2,3,5], target = 8原创 2020-08-03 19:50:29 · 569 阅读 · 0 评论 -
LeetCode算法 —— 外观数列(循环递推)
题目:给定一个正整数 n(1 ≤ n ≤ 30),输出外观数列的第 n 项。注意:整数序列中的每一项将表示为一个字符串。「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下:111211211111221第一项是数字 1描述前一项,这个数是 1 即 “一个 1 ”,记作 11描述前一项,这个数是 11 即 “两个 1 ” ,记作 21描述前一项,这个数是 21 即 “一个 2 一个 1 ” ,记作 1211描述原创 2020-07-31 08:51:49 · 276 阅读 · 0 评论 -
LeetCode算法 —— 解数独
题目如下所示:编写一个程序,通过已填充的空格来解决数独问题。一个数独的解法需遵循如下规则:数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。空白格用 ‘.’ 表示。Note:给定的数独序列只包含数字 1-9 和字符 ‘.’ 。你可以假设给定的数独只有唯一解。给定数独永远是 9x9 形式的。代码如下所示:#include <iostream>#include <algorith原创 2020-07-31 08:48:28 · 1721 阅读 · 0 评论 -
LeetCode算法 —— 有效的数独
题目:判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。示例 1:输入:[[“5”,“3”,".",".",“7”,".",".",".","."],[“6”,".",".",“1”,“9”,“5”,".",".","."],[".",“9”,“8”,".",".",".",".",“6”,"."],[“8”,"."原创 2020-07-31 08:35:03 · 323 阅读 · 0 评论 -
LeetCode算法 —— 在排序数组中查找元素的第一个和最后一个位置
题目:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是 O(log n) 级别。如果数组中不存在目标值,返回 [-1, -1]。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: [3,4]示例 2:输入: nums = [5,7,7,8,8,10], target = 6输出: [-1,-1]代码如下所示:#include <iostream>原创 2020-07-31 08:33:14 · 217 阅读 · 0 评论 -
LeetCode算法 —— 搜索旋转排序数组
题目 :假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组?[0,1,2,4,5,6,7]?可能变为?[4,5,6,7,0,1,2]?)。搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回?-1?。你可以假设数组中不存在重复的元素。你的算法时间复杂度必须是?O(log?n) 级别。二分探索(O(LogN))#include <iostream>#include <stack>#include <algorithm&g原创 2020-07-27 18:38:18 · 212 阅读 · 0 评论 -
LeetCode算法 —— 最长有效括号
题目:给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。示例 1:输入: “(()”输出: 2解释: 最长有效括号子串为 “()”示例 2:输入: “)()())”输出: 4解释: 最长有效括号子串为 “()()”直接copy官方代码 . . .1)动态规划:代码如下所示:class Solution {public: // ( () () ) ( () // () ) ()() ) int longestValidP原创 2020-07-27 17:51:15 · 387 阅读 · 0 评论 -
LeetCode算法 —— 两数相除(移位操作高效方法)
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商。整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2示例 1:输入: dividend = 10, divisor = 3输出: 3解释: 10/3 = truncate(3.33333…) = truncate(3)原创 2020-07-25 00:42:40 · 620 阅读 · 0 评论 -
LeetCode算法 —— K 个一组翻转链表
题目:给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。示例:给你这个链表:1->2->3->4->5当 k = 2 时,应当返回: 2->1->4->3->5当 k = 3 时,应当返回: 3->2->1->4->5说明:你的算法只能使用常数的额外空间。你不能只是单纯的改变节点内部的值,而原创 2020-07-21 20:11:53 · 333 阅读 · 0 评论 -
LeetCode算法 —— 反转链表(递归 + 迭代)
题目:反转一个单链表。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL进阶:你可以迭代或递归地反转链表。递归的版本是看别人写的,只会写迭代,(>_<)代码如下所示:#include <iostream>using namespace std;struct ListNode { int val; ListNode* next; ListNo原创 2020-07-21 16:22:32 · 887 阅读 · 0 评论 -
LeetCode算法 —— 两两交换链表中的节点(递归 + 迭代)
官方的答案,搞懂之后在此作个笔记 . . .题目:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。代码如下所示:struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(NULL) {}};class Solution {public: // pre 1 -> 2 -> 3 -&.原创 2020-07-19 22:51:53 · 413 阅读 · 0 评论 -
LeetCode算法 —— 合并K个排序链表(归并思想、递归)
此题使用归并思想解题,步骤类似于归并排序方法题目:合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。示例:输入:[1->4->5,1->3->4,2->6]输出: 1->1->2->3->4->4->5->6代码如下所示:/** * Definition for singly-linked list. * struct ListNode { * int val; * .原创 2020-07-19 13:21:40 · 1056 阅读 · 0 评论 -
LeetCode算法 —— 括号生成(DFS +动态规划)
这个题目是看别的小伙伴写的,在此作个笔记 . . .题目:数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。示例:输入:n = 3输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]DFS 求解class Solution {public: vector<string> retArr; vector<string> generateParenthesis.原创 2020-07-18 21:58:14 · 724 阅读 · 1 评论 -
LeetCode算法 —— 有效的括号(栈的运用)
题目:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: “()”输出: true示例 2:输入: “()[]{}”输出: true示例 3:输入: “(]”输出: false示例 4:输入: “([)]”输出: false示例 5:输入: “{[]}”输出: true将左括号放入栈中,遇到一原创 2020-07-18 00:48:53 · 235 阅读 · 0 评论 -
LeetCode算法 —— 四数之和(排序 / 双指针原理)
原理和 三数之和是一样的,只不过加了一个数,我们只需要把第二个数限制在一个区域内活动就行了题目:给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。注意:答案中不可以包含重复的四元组。示例:给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。满足要求的四元组集合为:[[-1, .原创 2020-07-17 22:39:32 · 244 阅读 · 0 评论 -
LeetCode算法 —— 电话号码的字母组合(单向数据扩展匹配)
题目已经通过题目:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例:输入:“23”输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].说明:尽管上面的答案是按字典序排列的,但是你可以任意选择答案输出的顺序。解题思想:我们分别处理每一位数字的所有可能性,比如处理的是 “23”,我们先把 2对应的数据保存起来,数据对应的是 “.原创 2020-07-17 21:28:01 · 372 阅读 · 1 评论 -
LeetCode算法 —— 最接近的三数之和(排序 / 双指针原理)
此题和《三数之和》原理是一样的,可以拿来练练双指针 . . .链接如下所示:LeetCode算法 —— 三数之和(排序 / 双指针原理)题目:给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。示例:输入:nums = [-1,2,1,-4], target = 1输出:2解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。代.原创 2020-07-17 01:42:03 · 312 阅读 · 1 评论 -
LeetCode算法 —— 三数之和(排序 / 双指针原理)
题目:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。示例:给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:[[-1, 0, 1],[-1, -1, 2]]为何排序:将数组排序好之后,可以大大的提高算法的效率,利用双指针原理进行工作,可以减少大量的重复判断为何使用双指针:使用双指针可以将原创 2020-07-17 00:14:30 · 401 阅读 · 0 评论 -
LeetCode算法 —— 最长公共前缀
横向暴力探索即可题目:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。示例 1:输入: [“flower”,“flow”,“flight”]输出: “fl”示例 2:输入: [“dog”,“racecar”,“car”]输出: “”解释: 输入不存在公共前缀。说明:所有输入只包含小写字母 a-z 。代码如下所示:class Solution {public: string longestCommonPrefix(vector<.原创 2020-07-16 19:09:38 · 224 阅读 · 0 评论 -
LeetCode算法 —— 罗马数字转整数(详解官方高效率答案)
因为自己写的程序效率太低,所以看了一下别人的答案,发现是真的厉害,所以学习了一波,将别人的源码进行讲解一下,以供大家学习 . . .题目:代码如下所示:class Solution {public: int romanToInt(string s) { int sum = 0; int preNum = getValue(s[0]); // 获取第一个字符的值 for (size_t i = 1; i <.原创 2020-07-13 21:54:53 · 333 阅读 · 1 评论 -
LeetCode算法 —— 整数转罗马数字
题目:罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。题目思路比较简单,我们先从字符对应的数值 1000 500 . . . 5 1 从大到小搜索判断,在判断的过程中,看看当前剩下的数值是否满足下面的条件,4 或 9 的 10 的n倍,例如:4、9、40、90、400、900 . . .此题用 C# 求解,代码如下:public class Solution { public string IntToRoman(int num)原创 2020-07-12 19:37:18 · 473 阅读 · 1 评论 -
LeetCode算法 —— 盛最多水的容器(双指针原理详解)
作者:浪子花梦,一个有趣的程序员 ~这个题目比较简单,因为以前做过相关的题目,写好了之后看了一下官方的答案,发现都差不多,此文来讲解这个双指针原理,没看官方的解释 ~题目:给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器,且 n 的值至少为 2。示例:输入:[1,8,6,2.原创 2020-07-11 18:56:15 · 694 阅读 · 1 评论 -
LeetCode算法 —— 正则表达式匹配(详解官方动态规划思想)
原本准备在暑假学习DP算法的,但最近感觉心里少了什么东西一样,原来是自己不了解DP 导致的空落感,所以把官方的答案 和 度娘的解释看了一遍,自己用 Debug 测试了一下,把自己的所想分享给大家 . . ..前文链接(递归解决正则表达式匹配):LeetCode算法 —— 正则表达式匹配(详解官方递归思想)...原创 2020-06-27 20:01:33 · 2984 阅读 · 2 评论 -
LeetCode算法 —— 正则表达式匹配(详解官方递归思想)
这个题目我想了一天也没有做出来,一直是单调的字符串处理思想解题,导致后期各种 bug好在我知难而退,看了一波大家的题解,觉得递归的那个题解非常的有趣(动态规划没研究过,暑假再学习吧). . .原题解链接:正则表达式匹配 c++实现两种解法 递归法和动态规划法 图示讲解.题目:给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部.原创 2020-06-21 12:18:15 · 1373 阅读 · 2 评论