
数据结构
提升自己对数据结构的理解
小黑cc
小黑cc的博客
展开
-
Java实现 leetcode-79. 单词搜索
没想到其他好的方法,试试暴力解题,仔细思考想到几个难点:1.怎么找入口去遍历word,感觉需要遍历二维数组。2. 上下左右在二维数组中寻找下一个单词的时候怎样才能不去找已经找过的位置,好像用回溯可以解决。我自己感觉这个解法就是简单的模拟,看不懂的话拿出纸和笔画一画就懂了。这个题第一眼看去,居然是个中等的难度,不该是hard嘛。原创 2022-09-14 11:16:34 · 293 阅读 · 0 评论 -
Java实现 leetcode-946. 验证栈序列
这道题是试卷上经常出的考试题目,但是放在程序题中还是第一次做,使用了一个变量p模拟栈顶部。(注释全在代码里了)如果实在看不懂,拿出纸和笔画一下就知道了。原创 2022-08-31 08:58:40 · 1172 阅读 · 2 评论 -
Java实现 Leetcode-51.N皇后
看完这道题之后画了一下图,大概总结了行列不能相等,也就是横坐标和纵坐标不能相等,斜线不能相等,也就是说横坐标只之差和纵坐标之差不能相等。然后是一个多重的循环的问题,往回溯方向想。之后写出来的代码如下(注释全在代码里了)是在看不懂的话,拿出纸和笔画一画噢。...原创 2022-08-12 10:33:55 · 210 阅读 · 0 评论 -
java滑动窗口实现 76. 最小覆盖子串 和 438. 找到字符串中所有字母异位词
76. 最小覆盖子串438. 找到字符串中所有字母异位词两个都是字符串里面使用滑动窗口,我认为有着他们的特定和共性,所以总结出来。第一个题的窗口大小是变化的,第二个题使用的是固定大小的滑动窗口。题解写好了注释,实在看不懂的话,拿出纸和笔推演一下就懂了。最小覆盖子串:class Solution { public String minWindow(String s, String t) { int[] temp = new int[123];//模拟所有的字母。原创 2022-04-24 10:36:31 · 173 阅读 · 0 评论 -
java实现49. 字母异位词分组,一错再错,总结一下
第一次提交:“暴力求解?” 后面看了题解之后:“哦,原来还可以这样” 二刷看到这个题我一脸懵,“暴力求解?”于是乎: 我先贴一个我超时的代码(两次超时代码一摸一样,醉了),总结一下我错哪。看题解的小伙伴可以直接跳过这段。我的思路大概是这样的,两层for循环遍历求解,中间核心代码是用isSome(String s,String t)判断两个字符串是不是字母异位词,用了两种方法来尽量减少暴力求解的用时,第一个是再判断是不是字母异位词的时候用长度26的整形数组做哈希表。第二个是将已经分组的字符串置原创 2022-04-24 09:09:11 · 981 阅读 · 0 评论 -
java 实现剑指 Offer II 010. 和为 k 的子数组,记录一下我第一次使用前缀和
看到这道题之后,非常想当然就感觉这是一道简单的滑动窗口,一滑就感觉不对劲了,窗口无论增大或者变小,窗口里面的和都有可能会增大或者变小。坚持滑动窗口到感觉不可能之后,去看了之前写过的滑动窗口,例如剑指 Offer II 008. 和大于等于 target 的最短子数组,我发觉了,那个里面直接写明了,数组里面全是正整数。于是我开始了暴力解题。两层for循环搞起: public int subarraySum(int[] nums, int k) { int result = 0;原创 2022-04-23 15:55:34 · 714 阅读 · 0 评论 -
java实现leetcode-17.电话号码的组合,来讲讲我对回溯的理解
仔细审题,会发现这是个组合问题,于是我就往回溯的方向去思考了(关于组合的问题可以用回溯哦),可能有小伙伴第一次对回溯有点陌生,我稍微讲讲我对回溯的理解。回溯的本质呢就是穷举,暴力搜索。用来解决那种用for循环嵌套暴力搜索都很难解决的问题。就比如说这个题,用for循环嵌套去解题的话是不是有点窒息呢? 来看看代码吧,思想都在注释里面,要是看不懂的话,拿出纸和笔推算一下就懂了。class Solution { //用于获取结果集 List<String> result = ne原创 2022-04-15 10:16:50 · 295 阅读 · 1 评论 -
java实现 leetcode98.验证二叉搜索树,这些坑你就不要再踩了
记录一下,这个easy题我wa了一个小时,总感觉就差一点点就能ac。我的逻辑没错,只要再修改一点点。神tm亿点点,我踩过的这些坑,你就不要再踩了。陷阱1:不能单纯的比较左节点小于中间节点,右节点大于中间节点就够了。我们要比较的是左子树所有节点小于中间节点,右子树左右节点大于中间节点。陷阱2:样例中的最小节点,可能是int的最小值,如果用最小的int(Integer.MIN_VALUE)来比较是不行的。此时可以初始化为Long.MIN_VALUE 先跟大家说说我改代码最后的思想吧(中间的曲折就不原创 2022-04-11 11:23:37 · 713 阅读 · 1 评论 -
java求二叉树的最大宽度
看我的这个代码的话,你得先理解二叉树的宽度遍历是怎么做的,如果没有这个基础的话,先移步这里:宽度优先遍历在最后面哦我在这里写了两种方法实现宽度优先遍历,一种使用了hashmap,第二种没有使用,节省了空间。直接上代码吧,注释很清楚了。/** * @author zrulin * @create 2022-04-02 10:05 */public class 求二叉树的最大宽度 { //基于队列,基于宽度优先遍历 public static void widthTraversal原创 2022-04-02 10:56:15 · 625 阅读 · 2 评论 -
Java实现leetcode--257.二叉树的所有路径。
看到这个题之后思考了许久,然后想到层次遍历,灵光一闪,似乎好像可以,直接开干。看了许多题解,感觉我自己的这种思想还挺新颖的,时间复杂度的话只遍历了一遍,取值也是以下标形式取址的。所以整体应该是O(N)的复杂度吧。然后除了遍历用的队列,以及结果集所需的List集合,也没有额外的开销了。emm自我感觉还不错,记录下来,与君共享。class Solution { public List<String> binaryTreePaths(TreeNode root) { Lis原创 2022-04-09 14:26:38 · 1023 阅读 · 1 评论 -
Java实现leetcode-106.根据中序遍历和后序遍历构造二叉树
根据一棵树的中序遍历与后序遍历构造二叉树。思路: 根据后序遍历,先找到这棵树根节点的值,也就是数组中最后一个元素(数组长度-1)的位置,由此创建根节点。然后在中序遍历中找到根的值所在的下标,切出左右子树。示例:中序:inorder = [9,3,15,20,7]后序:postorder = [9,15,7,20,3]那么代码应该怎么写呢?来看一下一共分为几步:第一步:如果数组大小为零的话,说明就是空节点了。第二步:如果不为空的话,那么取后序数组的最后一个元素作为节点元素。第三步:找到原创 2022-04-10 15:29:29 · 1097 阅读 · 2 评论 -
使用Java花样解决leetcode102.二叉树的层序遍历
自己用了两种方法写了这个二叉树层序遍历,但没想到看了看题解,又蹦出两种方法,都让我受益匪浅,具体运行时的注解全在代码里面了,刚开始看到这个题,立马想到二叉树的宽度优先遍历嘛。二话不说,直接队列走起:class Solution { public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> result = new ArrayList<&原创 2022-04-08 16:30:47 · 763 阅读 · 2 评论 -
剑指 Offer 58 - II. 左旋转字符串---java代码解决
看到这个题目的第一想法就是使用一个StringBuffer把前面的部分和后面的部分调转顺序存入来解决。代码如下class Solution { public String reverseLeftWords(String s, int n) { StringBuffer result = new StringBuffer(); int p1 = 0; int p2 = n; while(p2 < s.length()){原创 2022-04-01 15:42:11 · 69 阅读 · 1 评论 -
SpringBoot使用前缀树实现敏感词的过滤
记录一下使用SpringBoot中使用前缀树对敏感词的一个过滤。首先呢在resources目录下建立一个文件用来装敏感词例如我在resources/sensitive-words.txt如下:敏感词就不在这里展示了,从这去开始写过滤器啦,先准备好过滤器:@Componentpublic class SensitiveFilter { //记录日志 private static final Logger logger = LoggerFactory.getLogger(SensitiveF原创 2022-04-02 08:37:36 · 727 阅读 · 3 评论 -
java递归和非递归方式实现二叉树的先序遍历,中序遍历,后序遍历
注释全在代码里面了。先序遍历/** * * 遍历顺序:头左右 * * @author zrulin * @create 2022-03-15 21:05 */public class 先序遍历 {//递归实现: public static void preTraversal(Node head){ if(head == null){ return; } System.out.print(head.val.原创 2022-04-02 09:47:23 · 1024 阅读 · 1 评论