数据结构与算法
Jarlen John
记录学习过程,见证技术成长! Stay hungry,Stay foolish!
展开
-
LeetCode 43.字符串相乘
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。原创 2024-02-28 14:24:59 · 462 阅读 · 0 评论 -
LeetCode 42. 接雨水
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。原创 2024-02-24 16:21:24 · 350 阅读 · 0 评论 -
LeetCode 41. 缺失的第一个正数
给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。原创 2024-02-23 15:02:24 · 486 阅读 · 0 评论 -
LeetCode 40.组合总和 II
给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用 一次。注意:解集不能包含重复的组合。原创 2024-01-26 17:34:16 · 347 阅读 · 0 评论 -
LeetCode 39. 组合总和
给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以 无限制重复被选取。如果至少一个数字的被选数量不同,则两种组合是不同的。对于给定的输入,保证和为 target 的不同组合数少于 150 个。原创 2024-01-19 12:21:58 · 373 阅读 · 0 评论 -
LeetCode 38. 外观数列
给定一个正整数 n ,输出外观数列的第 n 项。「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。你可以将其视作是由递归公式定义的数字字符串序列:countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转换成另一个数字字符串。前五项如下:1. 12. 113. 21第一项是数字 1描述前一项,这个数是 1 即 “ 一 个 1 ”,记作 “11”原创 2024-01-17 12:08:05 · 563 阅读 · 0 评论 -
LeetCode 37. 解数独
编写一个程序,通过填充空格来解决数独问题。数独的解法需 遵循如下规则:数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)数独部分空格内已填入了数字,空白格用 ‘.’ 表示。原创 2024-01-16 11:39:53 · 510 阅读 · 0 评论 -
LeetCode 36. 有效的数独
请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。原创 2024-01-12 11:36:13 · 1088 阅读 · 0 评论 -
LeetCode 35. 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。原创 2024-01-11 18:16:20 · 536 阅读 · 0 评论 -
LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。原创 2024-01-11 11:07:52 · 482 阅读 · 0 评论 -
LeetCode 33. 搜索旋转排序数组
整数数组 nums 按升序排列,数组中的值 互不相同。在传递给函数之前,nums 在预先未知的某个下标 k(0原创 2024-01-10 11:10:29 · 647 阅读 · 0 评论 -
LeetCode 32. 最长有效括号
给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号子串的长度。原创 2024-01-09 14:23:45 · 737 阅读 · 1 评论 -
LeetCode 31. 下一个排列
整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1]。整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。原创 2024-01-08 17:55:41 · 685 阅读 · 0 评论 -
LeetCode 30. 串联所有单词的子串
给定一个字符串 s 和一个字符串数组 words。words 中所有字符串 长度相同。s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。例如,如果 words = [“ab”,“cd”,“ef”], 那么 “abcdef”, “abefcd”,“cdabef”, “cdefab”,“efabcd”, 和 “efcdab” 都是串联子串。“acdbef” 不是串联子串,因为他不是任何 words 排列的连接。返回所有串联子串在 s 中的开始索引。原创 2024-01-05 17:39:13 · 1043 阅读 · 0 评论 -
LeetCode 50. Pow(x, n)
实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,x^n )。原创 2024-01-04 18:08:30 · 499 阅读 · 0 评论 -
LeetCode 29. 两数相除
给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求 不使用 乘法、除法和取余运算。整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345 将被截断为 8 ,-2.7335 将被截断至 -2。返回被除数 dividend 除以除数 divisor 得到的 商。注意:假设我们的环境只能存储 32 位 有符号整数,其数值范围是 [−231, 231 − 1]。本题中,如果商 严格大于 231 − 1 ,则返回 231 − 1;原创 2024-01-04 12:23:39 · 916 阅读 · 0 评论 -
LeetCode 28.找出字符串中第一个匹配项的下标
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1。示例 1:输入:haystack = “sadbutsad”, needle = “sad”输出:0解释:“sad” 在下标 0 和 6 处匹配。第一个匹配项的下标是 0 ,所以返回 0。原创 2024-01-03 15:25:38 · 766 阅读 · 0 评论 -
LeetCode 27.移除元素
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。原创 2024-01-01 21:05:45 · 803 阅读 · 0 评论 -
LeetCode 26.删除排序数组中的重复项
给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致。然后返回 nums 中唯一元素的个数。考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。返回 k。原创 2023-12-31 17:59:58 · 560 阅读 · 0 评论 -
LeetCode 206. 反转链表
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例。原创 2023-12-29 16:34:07 · 705 阅读 · 0 评论 -
LeetCode 25. K 个一组翻转链表
给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。原创 2023-12-29 13:59:27 · 691 阅读 · 0 评论 -
LeetCode 24. 两两交换链表中的节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。原创 2023-12-27 12:06:45 · 641 阅读 · 0 评论 -
LeetCode 23. 合并 K 个升序链表
给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。原创 2023-12-26 19:25:22 · 655 阅读 · 0 评论 -
LeetCode 22. 括号生成
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。示例 1:输入:n = 3输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]示例 2:输入:n = 1输出:[“()”]原创 2023-12-25 18:31:43 · 360 阅读 · 0 评论 -
LeetCode 21. 合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。此题比较容易想到的解法是迭代法,生成哑巴节点,然后迭代生成后续节点。原创 2023-12-24 23:12:30 · 703 阅读 · 0 评论 -
LeetCode 20. 有效的括号
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。原创 2023-12-23 11:07:01 · 633 阅读 · 0 评论 -
LeetCode 19. 删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。关于内存问题:由于Swift及OC均有ARC内存机制,因此删除的节点内容未主动释放,如在手动内存管理的情况下,需要释放被删除节点的内存占用。原创 2023-12-22 17:11:43 · 644 阅读 · 0 评论 -
LeetCode 18. 四数之和
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):a、b、c 和 d 互不相同你可以按 任意顺序 返回答案。原创 2023-12-22 10:14:02 · 567 阅读 · 0 评论 -
LeetCode 17. 电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。关键字:所有组合模式识别:搜索算法解题思路:自顶向下的递归实现深度搜索定义子问题在当前递归层结合子问题解决原问题。原创 2023-12-21 12:15:55 · 504 阅读 · 0 评论 -
LeetCode 1~10
训练思维,提高编程能力,不为刷题而刷题。原创 2023-11-21 18:10:02 · 242 阅读 · 0 评论 -
LeetCode 12. 整数转罗马数字
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II。27 写做 XXVII, 即为 XX + V + II。通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4。同样地,数字 9 表示为 IX。原创 2023-12-15 11:36:29 · 434 阅读 · 0 评论 -
LeetCode 13. 罗马数字转整数
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II。27 写做 XXVII, 即为 XX + V + II。通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4。同样地,数字 9 表示为 IX。原创 2023-12-16 18:32:30 · 540 阅读 · 0 评论 -
LeetCode 14. 最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。原创 2023-12-18 14:31:30 · 509 阅读 · 0 评论 -
LeetCode 15. 三数之和
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i!= j、i!= k 且 j!= k ,同时还满足 nums[i] + nums[j] + nums[k] == 0。请你返回所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。原创 2023-12-19 15:34:36 · 524 阅读 · 0 评论 -
LeetCode16. 最接近的三数之和
给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在恰好一个解。原创 2023-12-20 12:27:23 · 1234 阅读 · 0 评论 -
LeetCode11.盛最多水的容器
给定一个长度为 n 的整数数组 height。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i])。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明:你不能倾斜容器。(哈哈哈, 你高估我了)解题思路:通过双指针的思想,从两头往中间遍历的同时计算需要的结果,注意每次移动较小的一个。原创 2023-12-13 14:01:05 · 508 阅读 · 0 评论 -
separating axis test——分离轴测试算法的实现
旋转后矩形相交问题解决原创 2022-06-28 18:55:11 · 664 阅读 · 0 评论 -
剑指offer题目练习及思路分析-JavaScript版(二)
树的子结构输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)/* function TreeNode(x) { this.val = x; this.left = null; this.right = null;} */function HasSubtree(pRoot1, pRoot2){ if(!pR...原创 2018-07-03 23:46:02 · 304 阅读 · 0 评论 -
剑指offer题目练习及思路分析-JavaScript版(二)
树的子结构输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)/* function TreeNode(x) { this.val = x; this.left = null; this.right = null;} */function HasSubtree(pRoot1, pRoot2){ if(!pR...原创 2018-04-26 11:30:27 · 199 阅读 · 0 评论 -
剑指offer题目练习及思路分析-JavaScript版(一)
二维数组中的查找在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。function Find(target, array){ var row = array.length; var col = array[0].length; var i, j=0;...原创 2018-03-21 23:51:49 · 804 阅读 · 0 评论