![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
PG_EngineeringMan
这个作者很懒,什么都没留下…
展开
-
Leetcode刷题经验
Java学习笔记Leetcode刷题经验热题HOT100142、环形链表 II Leetcode刷题经验 热题HOT100 142、环形链表 II 解题思路: 该题其实可以直接采用哈希表去存储这些数字,若发现哈希表里已有这个元素,则表明有环,为了降低空间复杂度,这里采用双指针的思想去进行求解,即快指针与慢指针,为了方便,这里直接借鉴官方提供的思路与算法: 时间复杂度:O(N)O(N)O(N),这里的NNN指的是链表的总节点个数;空间复杂度:O(1)O(1)O(1),由于采用的是双指针,故只需要常数级原创 2020-08-06 15:30:50 · 85 阅读 · 0 评论 -
Leetcode刷题经验
Java学习笔记Leetcode刷题经验热题HOT100141、环形链表 Leetcode刷题经验 热题HOT100 141、环形链表 解题思路: 这题比较简单,可以直接采用哈希表去存储这些数字,若发现哈希表里已有这个元素,则表明有环,为了降低空间复杂度,这里采用双指针的思想去进行求解,即快指针与慢指针,为了方便,这里直接借鉴官方提供的思路与算法: public class Solution { public boolean hasCycle(ListNode head) {原创 2020-08-06 15:00:42 · 93 阅读 · 0 评论 -
Leetcode刷题经验
Java学习笔记Leetcode刷题经验热题HOT100139、单词拆分 Leetcode刷题经验 热题HOT100 139、单词拆分 解题思路: 这里直接借鉴官方提供的思路与算法: 时间复杂度:O(N2)O(N^2)O(N2),其中 NNN 是 字符串的长度,又由于需要枚举,此外,哈希表判断一个字符串是否在给定的字符串列表里需要O(1)O(1)O(1)时间,故总时间复杂度为O(N2)O(N^2)O(N2);空间复杂度:O(N)O(N)O(N),其中 NNN 是 字符串的长度,因为我们需要O(N)O(原创 2020-08-06 11:29:42 · 124 阅读 · 0 评论 -
Leetcode刷题经验
Java学习笔记Leetcode刷题经验热题HOT100136、只出现一次的数字 Leetcode刷题经验 热题HOT100 136、只出现一次的数字 该题对时间复杂度和空间复杂度都有一定的限制,故不能使用下面三种方法: 上述三种解法都需要额外使用 O(n)O(n)O(n)的空间,其中 nnn 是数组长度。如果要求使用线性时间复杂度和常数空间复杂度,上述三种解法显然都不满足要求。 解题思路: 这里可以采用位运算(异或运算)的思路与算法: 因为异或运算具有如下的三个性质: 那么我们根据这三个性质,可以原创 2020-08-06 09:16:02 · 92 阅读 · 0 评论 -
Leetcode刷题经验
Java学习笔记Leetcode刷题经验热题HOT10049、字母异位词分组 Leetcode刷题经验 热题HOT100 49、字母异位词分组 该题可以借用 HashMapHashMapHashMap 的方式对字符串数组中的每一个字符串进行哈希映射,在保证每一个字符串的字符出现次数相等即可。 解题思路: 这里直接借鉴官方提供的思路与算法: 我们可以将每个字符串 sss 转换为字符数 countcountcount,由26个非负整数组成,表示 aaa,bbb,ccc 的数量等。我们使用这些计数作为哈希映射原创 2020-07-29 22:28:20 · 113 阅读 · 0 评论 -
Leetcode刷题经验
Java学习笔记Leetcode刷题经验热题HOT10048、旋转图像 Leetcode刷题经验 热题HOT100 48、旋转图像 该题可以比较简单,仔细观察给定的矩阵不难发现,只要先对矩阵进行转置,再对每一行元素进行翻转,便可得到顺时针旋转 909090 度后的新矩阵。 解题思路: 先转置,后对每行元素进行翻转即可。 时间复杂度:相当于进行两次循环,每个循环均由两个for循环构成,那么它的时间复杂度可以认为是 O(N2)O(N^2)O(N2);而空间复杂度:由于是原地旋转,故空间复杂度仅仅为 O(1)原创 2020-07-29 21:10:39 · 349 阅读 · 0 评论 -
Leetcode刷题经验
Java学习笔记Leetcode刷题经验热题HOT10046、全排列 Leetcode刷题经验 热题HOT100 46、全排列 该题可以很明显地看出来是使用回溯 + 深度优先搜索,使用深度优先搜索的目的是为了更好地使用栈,例如其中存储路径的 pathpathpath 。 解题思路: 这里直接借鉴官网的解题思路: 需要注意的是为了节省空间,这里采用动态维护数组的方法,而不采用标记数组的形式。 class Solution { public void backtrack(int n,原创 2020-07-29 20:24:01 · 136 阅读 · 0 评论 -
Leetcode刷题经验
Java学习笔记Leetcode刷题经验热题HOT10039、组合总和 Leetcode刷题经验 热题HOT100 39、组合总和 该题可以很轻易地看出来是使用回溯 + 排序,排序是为了更好地剪枝。 解题思路: 假设输入为candidates=[2,3,6,7],target=7。candidates=[2,3,6,7],target=7。candidates=[2,3,6,7],target=7。 依次拿出candidatescandidatescandidates数组中的元素,使之成为候选元素,例如找原创 2020-07-28 21:17:56 · 120 阅读 · 0 评论 -
Leetcode刷题经验
Java学习笔记Leetcode刷题经验热题HOT10017、电话号码的字母组合 Leetcode刷题经验 热题HOT100 17、电话号码的字母组合 该题比较简单,直接回溯 + 递归 。回溯是一种通过穷举所有可能情况来找到所有解的算法。如果一个候选解最后被发现并不是可行解,回溯算法会舍弃它,并在前面的一些步骤做出一些修改,并重新尝试找到可行解。对于该题,用不到回溯的剪枝。 解题思路: 这里直接引用官方的动图解释说明解题思路: 时间复杂度:O(3n∗4m)O(3^n*4^m)O(3n∗4m),其中 N原创 2020-07-23 14:38:17 · 71 阅读 · 0 评论 -
Leetcode刷题经验
Java学习笔记Leetcode刷题经验热题HOT10015、三数之和 Leetcode刷题经验 热题HOT100 15、三数之和 由于题目中要求答案中不可以包含重复的三元组,那么我们必须进行去重,这里采用排序先对数据进行排序,以方便去重;另外,由于该题是求三数之和,如果再用HashMap求,不会那么方便,那么这里采用双指针的方式进行查找,会方便很多。简言而知,就是排序 + 双指针 。 解题思路: 先确定下第一个数,然后再从数组中其余元素中挑出两个元素,使得这两个元素之和等于事先确定下来的第一个数的负数。在原创 2020-07-23 10:39:39 · 95 阅读 · 0 评论 -
Leetcode刷题经验
Java学习笔记Leetcode刷题经验热题HOT10011、盛最多水的容器 Leetcode刷题经验 热题HOT100 11、盛最多水的容器 该题很明显可以利用双指针的方法去进行求解,仔细分析题目不难发现,容器容水量的大小===两指针指向的数字中较小的值∗*∗两指针间的距离。 解题思路: 这里直接借鉴官方提供的解题思路: 时间复杂度:O(n)O(n)O(n),双指针总计最多遍历整个数组一次,而它的空间复杂度亦为:O(1)O(1)O(1),即只需要额外的常数级别的空间。 class Solution原创 2020-07-22 23:12:42 · 94 阅读 · 0 评论 -
Leetcode刷题经验
Java学习笔记Leetcode刷题经验热题HOT1005、最长回文子串 Leetcode刷题经验 热题HOT100 5、最长回文子串 首先,搞清楚回文串的概念:如果它是回文串,并且长度大于 2,那么将它首尾的两个字母去除之后,它仍然是个回文串。 解题思路: 这里直接借鉴官方提供的解题思路: 时间复杂度:O(n2)O(n^2)O(n2),其中 nnn是字符串 的长度,每个状态在进行转移时的时间复杂度为 O(1)O(1)O(1)。而它的空间复杂度亦为:O(n2)O(n^2)O(n2),即为存储所有状态使原创 2020-07-22 21:24:14 · 113 阅读 · 0 评论 -
Leetcode刷题经验
Java学习笔记Leetcode刷题经验热题HOT10010、正则表达式匹配 Leetcode刷题经验 热题HOT100 10、正则表达式匹配 由于题目中要求的是字符串与字符规律之间的匹配,可以近似看做是两个字符串的比较,那么我们可以采用动态规划来求解此问题。 解题思路: 题中给出:′.′'.'′.′ 匹配任意单个字符,而′∗′'*'′∗′ 匹配零个或多个前面的那一个元素,那么,′∗′'*'′∗′ 的前面一定有字符(包括′.′'.'′.′)。 这里直接借鉴官方提供的解题思路: 时间复杂度:O(mn)O原创 2020-07-22 21:14:18 · 98 阅读 · 0 评论 -
Leetcode刷题经验
Java学习笔记Leetcode刷题经验热题HOT1003、 无重复字符的最长子串 Leetcode刷题经验 热题HOT100 3、 无重复字符的最长子串 判断是否有重复,直接采用哈希集合即可,并可通过add以及remove方法区更新哈希集合的元素,从而计算出无重复字符的最长子串。 解题思路: 假设我们选择字符串中的第 kkk 个字符作为起始位置,并且得到了不包含重复字符的最长子串的结束位置为rkr_krk。那么当我们选择第 k+1k+1k+1个字符作为起始位置时,首先从 k+1k+1k+1 到rkr_原创 2020-07-21 19:55:40 · 127 阅读 · 0 评论 -
Leetcode刷题经验
Java学习笔记Leetcode刷题经验热题HOT1003、无重复字符的最长子串 Leetcode刷题经验 热题HOT100 3、无重复字符的最长子串 判断子串中是否含有重复字符,可以使用HashSet建立一个集合,(以空间换取时间)通过contains函数判断是否重复,并可以通过remove和add方法对各子串长度进行计算。 解题思路: 假设我们选择字符串中的第 k 个字符作为起始位置,并且得到了不包含重复字符的最长子串的结束位置为 rk,则当我们选择第 k+1个字符作为起始位置时,首先从 k+1到 r_原创 2020-07-19 22:12:22 · 110 阅读 · 0 评论 -
Leetcode刷题经验
Java学习笔记Leetcode刷题经验热题HOT1002、两数相加 Leetcode刷题经验 热题HOT100 2、两数相加 该题目指明,给出的是两个非空的链表,但测试样例里有空链表,表示不解。 解题思路: 链表问题,往往需要通过指定一个链表索引以方便查询记录链表信息。此外,该题主要有3处关键点信息需要注意: 第一处: 在按位依次进行相加时,需要注意,要谨记加上前一结点的进位,而且要计算并保存下一结点的进位,这里进位可以直接通过求商的形式得到。 第二处: 当遇到两个链表长度不一致时,需要停止短链表,并继续原创 2020-07-19 16:10:43 · 96 阅读 · 0 评论 -
Leetcode刷题经验
Java学习笔记Leetcode刷题经验热题HOT1001、两数之加 Leetcode刷题经验 热题HOT100 1、两数之加 由于题目已经假设每种输入只会对应一个答案,而且要求数组中同一个元素不能使用两遍,那么可以直接进行双层遍历,在第二次的遍历的时候直接在第一次遍历的数组元素下标+1即可,故很容易想到第一种思路。同时为了提高代码的可靠性,需要抛出异常。 第一种解题思路:直接暴力求解,两次遍历即可,第一次遍历整数数组 nums 中的每个元素值,并分别对每个元素值再次进行遍历除该元素之外的整数数组 nums原创 2020-07-18 11:11:03 · 143 阅读 · 0 评论 -
数据结构与算法
Java学习笔记数据结构与算法1、常见的排序算法复杂度2、Leetcode刷题经验3、剑指Offer刷题经验4、《大话数据结构》学习总结5、《编程之美》学习总结6、《编程珠玑》学习总结7、算法的优化 数据结构与算法 1、常见的排序算法复杂度 2、Leetcode刷题经验 3、剑指Offer刷题经验 4、《大话数据结构》学习总结 5、《编程之美》学习总结 6、《编程珠玑》学习总结 7、算法的优化 ...原创 2020-07-16 18:07:44 · 114 阅读 · 0 评论