leetcode
文章平均质量分 69
是我,Zack
就职于某公司大数据部,负责开发、实施、运维相关工作,喜欢边学习边笔记,热衷分享、开源,有大数据方向感兴趣的小伙伴欢迎多多交流~
展开
-
leetcode 938.二叉搜索树的范围和
方法一:深度优先搜索思路按深度优先搜索的顺序计算范围和。记当前子树根节点为 root,分以下四种情况讨论:root 节点为空,返回 0。root 节点的值大于 high由于二叉搜索树右子树上所有节点的值均大于根节点的值,即均大于 high,故无需考虑右子树,返回左子树的范围和。root 节点的值小于low由于二叉搜索树左子树上所有节点的值均小于根节点的值,即均小于low,故无需考虑左子树,返回右子树的范围和。root 节点的值在[low,high] 范围内此时应返回 root 节原创 2021-04-27 11:32:07 · 88 阅读 · 0 评论 -
leetcode 1011.在D天内送达包裹的能力(二分)
首先,我们可以明确最低运载能力必须要不小于数组中的最大值(必须要满足一天至少运一个,运载能力至少要比每个包裹的重量都要大才行,不然就会出现有包裹一直运不走),不大于数组的总和(一天全部运走),即区间[max(weights), sum(weights)];那么我们怎么判断运载能力为值H的时候能满足在D天內送达呢?见函数verification:1、判断最低运载能力为H的时候能否在D天内送达//判断最低运载能力为H的时候能否在D天内送达public boolean verification(int[]原创 2021-04-27 00:14:13 · 209 阅读 · 0 评论 -
leetcode 006.Z字形变换(按行排序、按行访问)
方法一:按行排序思路通过从左向右迭代字符串,我们可以轻松地确定字符位于 Z 字形图案中的哪一行。算法我们可以使用 min(numRows,len(s)) 个列表来表示 Z 字形图案中的非空行。从左到右迭代 s,将每个字符添加到合适的行。可以使用当前行和当前方向这两个变量对合适的行进行跟踪。只有当我们向上移动到最上面的行或向下移动到最下面的行时,当前方向才会发生改变。class Solution { public String convert(String s, int numRows)原创 2021-04-22 12:34:50 · 150 阅读 · 0 评论 -
leetcode 091.解码方法(动态规划、递推)
方法一:动态规划思路与算法对于给定的字符串 s,设它的长度为 n,其中的字符从左到右依次为s[1],s[2],⋯,s[n]。我们可以使用动态规划的方法计算出字符串 s 的解码方法数。具体地,设f[i]表示字符串 s 的前i 个字符 s[1…i] 的解码方法数。在进行状态转移时,我们可以考虑最后一次解码使用了 s 中的哪些字符,那么会有下面的两种情况:第一种情况是我们使用了一个字符,即 s[i] 进行解码,那么只要,它就可以被解码成A∼I 中的某个字母。由于剩余的前i−1 个字符的解码方法数为f i−原创 2021-04-21 23:08:48 · 139 阅读 · 0 评论 -
leetcode 005.最长回文子串(动态规划、中心扩展算法、Manacher算法)
方法一:动态规划思路与算法对于一个子串而言,如果它是回文串,并且长度大于 22,那么将它首尾的两个字母去除之后,它仍然是个回文串。例如对于字符串 “ababa”,如果我们已经知道 \textrm{``bab’’}“bab” 是回文串,那么“ababa” 一定是回文串,这是因为它的首尾两个字母都是 “a”。根据这样的思路,我们就可以用动态规划的方法解决本题。我们用P(i,j) 表示字符串 s 的第i 到 j 个字母组成的串(下文表示成 s[i:j])是否为回文串:这里的「其它情况」包含两种可能性:原创 2021-04-21 12:14:39 · 148 阅读 · 0 评论 -
leetcode 004.寻找两个有序数组的中位数
解法一:暴力破解法简单粗暴,先将两个数组合并,两个有序数组的合并也是归并排序中的一部分。然后根据奇数,还是偶数,返回中位数。代码class Solution { public double findMedianSortedArrays(int[] nums1, int[] nums2) { int[] nums; int m = nums1.length; int n = nums2.length; nums = new int[原创 2021-04-20 23:29:17 · 428 阅读 · 1 评论 -
leetcode 003.无重复字符的最长字串 滑动串口
方法一:滑动窗口思路和算法我们先用一个例子考虑如何在较优的时间复杂度内通过本题。我们不妨以示例一中的字符串 abcabcbb 为例,找出从每一个字符开始的,不包含重复字符的最长子串,那么其中最长的那个字符串即为答案。对于示例一中的字符串,我们列举出这些结果,其中括号中表示选中的字符以及最长的字符串:以 (a)bcabcbb 开始的最长字符串为 (abc)abcbb;以 a(b)cabcbb 开始的最长字符串为 a(bca)bcbb;以 ab©abcbb 开始的最长字符串为 ab(ca原创 2021-04-20 19:35:19 · 222 阅读 · 0 评论 -
leetcode 028.实现strStr(),即查找重复字符串(KMP算法)
前言本题是经典的字符串单模匹配的模型,因此可以使用字符串匹配算法解决,常见的字符串匹配算法包括暴力匹配、Knuth-Morris-Pratt 算法、Boyer-Moore 算法、Sunday 算法等,本文 ## 前言本题是经典的字符串单模匹配的模型,因此可以使用字符串匹配算法解决,常见的字符串匹配算法包括暴力匹配、Knuth-Morris-Pratt 算法、Boyer-Moore 算法、Sunday 算法等,本文将讲解朴素解法(暴力匹配)和KMP算法因为哈希方法可能出现哈希值相等但是字符串不相等的情况原创 2021-04-20 17:16:14 · 1571 阅读 · 0 评论 -
leetcode 002.两数相加(链表)
思路与算法由于输入的两个链表都是逆序存储数字的位数的,因此两个链表中同一位置的数字可以直接相加。我们同时遍历两个链表,逐位计算它们的和,并与当前位置的进位值相加。具体而言,如果当前两个链表处相应位置的数字为 n1,n2n1,n2,进位值为}carry,则它们的和为 n1+n2+carry;其中,答案链表处相应位置的数字为 (n1+n2+carry)mod10,而新的进位值为 如果两个链表的长度不同,则可以认为长度短的链表的后面有若干个 00 。此外,如果链表遍历结束后,有 carry>0,还需原创 2021-04-20 13:05:27 · 175 阅读 · 0 评论 -
leetcode 001.两数之和
方法一:暴力枚举思路及算法最容易想到的方法是枚举数组中的每一个数 x,寻找数组中是否存在 target - x。当我们使用遍历整个数组的方式寻找 target - x 时,需要注意到每一个位于 x 之前的元素都已经和 x 匹配过,因此不需要再进行匹配。而每一个元素不能被使用两次,所以我们只需要在 x 后面的元素中寻找 target - x。代码class Solution { public int[] twoSum(int[] nums, int target) { i..原创 2021-04-19 23:38:32 · 266 阅读 · 0 评论 -
leetcode 027.移除元素
方法一:双指针思路及算法由于题目要求删除数组中等于val 的元素,因此输出数组的长度一定小于等于输入数组的长度,我们可以把输出的数组直接写在输入数组上。可以使用双指针:右指针 right 指向当前将要处理的元素,左指针 left 指向下一个将要赋值的位置。如果右指针指向的元素不等于 val,它一定是输出数组的一个元素,我们就将右指针指向的元素复制到左指针位置,然后将左右指针同时右移;如果右指针指向的元素等于val,它不能在输出数组里,此时左指针不动,右指针右移一位。整个过程保持不变的性质是:区原创 2021-04-19 23:04:21 · 150 阅读 · 0 评论