java数据结构与算法
文章平均质量分 54
刷题面试
蓦然回首却已人去楼空
这个作者很懒,什么都没留下…
展开
-
二叉树-翻转二叉树
题目思路DFS使用BFS遍历的时候交换只需要对原有的BFS遍历时加上交换的代码即可(老三行)。 public TreeNode invertTree(TreeNode root) { public TreeNode invertTree(TreeNode root) { //root为空的情况要进行排除否则会在交换时出现空指针异常 if(root==null) { return null; } //用层序遍历完成对二叉树的原创 2022-03-27 10:17:50 · 392 阅读 · 0 评论 -
二叉树-二叉树的层序遍历
参考:nettee题目DFS与BFSDFS(深度优先搜索)和 BFS(广度优先搜索)就像孪生兄弟,提到一个总是想起另一个。然而在实际使用中,我们用 DFS 的时候远远多于 BFS。在二叉树的遍历上,两者不同之处在于代码的简易程度不同和遍历的顺序不同。遍历的顺序就是数字的顺序。void dfs(TreeNode root) { if (root == null) { return; } dfs(root.left); dfs(root.right)原创 2022-03-26 23:58:00 · 163 阅读 · 0 评论 -
二叉树-二叉树的迭代遍历
前序遍历处理:将元素放进result数组中(根节点-中间)访问:遍历节点/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(in原创 2022-03-25 23:23:06 · 61 阅读 · 0 评论 -
二叉树-二叉树的递归遍历
递归确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。确定终止条件:操作系统是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。确定单层递归的逻辑。前序遍历1. 确定递归函数的参数和返回值把树和用于存放前序的list作为参数。递归函数不需要返回值,因为我们把要求的都放入list里面,由主函数输出。2. 终止条件当前遍历的节点是空了,那么本层递归就要要结束了,所以原创 2022-03-25 00:41:04 · 900 阅读 · 0 评论 -
栈与队列-前 K 个高频元素
题目思路统计出现频率,在之前哈希表也有用到过Java中Collections.sort()的使用在日常开发中,很多时候都需要对一些数据进行排序的操作。然而那些数据一般都是放在一个集合中如:Map ,Set ,List 等集合中。他们都提供了一个排序方法 sort(),要对数据排序直接使用这个方法就行,但是要保证集合中的对象是可比较的。怎么让一个对象是 可比较的,那就需要该对象实现 Comparable 接口。然后重写里面的compareTo()方法。我们可以看到Java中很多类都是实现原创 2022-03-24 13:17:49 · 1050 阅读 · 0 评论 -
栈与队列-滑动窗口最大值
题目思路前面出,后面进。这已经不能再明显了,我们显然要使用队列这种数据结构了。offer()方法在可能的情况下插入一个元素,否则返回false,这和Collection.add方法不同,后者只能通过抛出一个uncheck Exception来表示插入元素失败(什么是不检查异常?下次总结),offer()方法是为了正常情况下的“失败”而设计的,而不是异常情况,比如固定容量的队列。remove()和poll()方法删除并且返回队首元素,至于从队列中删除哪一个元素就和队列排序策略的函数实现有关了(有各种原创 2022-03-20 14:32:10 · 771 阅读 · 0 评论 -
栈与队列-逆波兰表达式求值
题目思路看懂第一张图,基本就会发现,这就是将上一题中的消消乐环节,换成对应的计算。并且不用去考虑之前必须要考虑的if else(仅限消除的时候会用到)两者都是通过栈来实现。class Solution { public int evalRPN(String[] tokens) { Deque<Integer> deque = new LinkedList<>(); for (int i = 0; i < tokens.len.原创 2022-03-17 20:00:51 · 213 阅读 · 0 评论 -
栈与队列-删除字符串中的所有相邻重复项
题目思路这一题比上一题的括号要简单许多。这道题目就像是我们玩过的游戏对对碰,如果相同的元素放在挨在一起就要消除。此时就可以用一个栈来实现。综合上一题,我们会发现这个if else对于这类题是尤为重要的,尤其要注意我们关注的只有栈顶元素,只有这样我们才能正确的消除。public String removeDuplicates(String s) { Deque<Character> deque = new LinkedList<>(); f原创 2022-03-17 19:29:48 · 3618 阅读 · 0 评论 -
栈与队列-有效的括号
题目https://leetcode-cn.com/problems/valid-parentheses/思路public static boolean isValid(String s) { //先判断奇偶,奇数返回false if (s.length()%2==1){return false;} //偶 Deque<Character> deque = new LinkedList<>();原创 2022-03-17 17:07:36 · 623 阅读 · 0 评论 -
栈与队列-用队列实现栈
题目https://leetcode-cn.com/problems/implement-stack-using-queues/思路-两个队列先将push的元素放入辅助队列中交换辅助队列和主队列(是直接交换队列,队列底层用linkedlist实现)如果queue1中就有元素,我们则需要再进行一步操作(如图)代码class MyStack { Queue<Integer> queue1; Queue<Integer> queue2; pu原创 2022-03-16 21:21:00 · 404 阅读 · 0 评论 -
栈与队列-用栈实现队列
题目https://leetcode-cn.com/problems/implement-queue-using-stacks/思路队列是先进先出栈是先进后出所以我们用两个栈就可以实现注意在push数据的时候,只要数据放进输入栈就好,但在pop的时候,操作就复杂一些,输出栈如果为空,就把进栈数据全部导入进来(注意是全部导入),再从出栈弹出数据,如果输出栈不为空,则直接从出栈弹出数据就可以了。最后如何判断队列为空呢?如果进栈和出栈都为空的话,说明模拟的队列为空了。class MyQueu原创 2022-03-12 11:18:21 · 82 阅读 · 0 评论 -
字符串-重复的子字符串
题目https://leetcode-cn.com/problems/repeated-substring-pattern/思路-KMP求出next数组用一个小例子来说明next数组代码为什么这么写用next数组求解如果 next[len - 1] != 0,则说明字符串有最长相同的前后缀(最长相等前后缀的长度为:next[len - 1]如果len % (len - next[len - 1] ) == 0 ,则说明 (数组长度-最长相等前后缀的长度) 正好可以被 数组的长度整除,原创 2022-03-10 09:45:36 · 338 阅读 · 0 评论 -
字符串-实现 strStr()
题目https://leetcode-cn.com/problems/implement-strstr/暴力解法我们加上flag来进行判断 public int strStr(String haystack, String needle) { int n = haystack.length(), m = needle.length(); for (int i = 0; i <= n-m ; i++) { boolean flag =原创 2022-03-09 14:43:13 · 163 阅读 · 0 评论 -
字符串-剑指Offer58-II.左旋转字符串
题目思路一public String reverseLeftWords(String s, int n) { StringBuilder sb = new StringBuilder(); char[] c = s.toCharArray(); int end = c.length-1; int i =n; //1.存 while (i<=end){ sb.append(c[i原创 2022-03-08 13:45:26 · 236 阅读 · 0 评论 -
字符串-翻转字符串里的单词
题目https://leetcode-cn.com/problems/reverse-words-in-a-string/思路一-API选手join方法List<String> strings = List.of("Java", "is", "cool");String message = String.join(" ", strings);// message returned is: "Java is cool"split方法得到的结果显然不是我们想要的。说明我们应该原创 2022-03-08 11:02:36 · 360 阅读 · 0 评论 -
字符串-剑指Offer 05.替换空格
题目https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/思路一开始自然想到的是直接讲String转换成char数组,然后用ascii码值把空格换成%20.但很显然,%20不是char类型,会发现String是无法存到字符数组里面的。此时,说明我们需要新建一个数组来存储。但这个数组要保证最坏的情况,就是数组里面元素基本都是空格。建立字符数组地长度为 s 的长度的 3 倍,这样可保证字符数组可以容纳所有替换后的字符。 public St原创 2022-03-07 16:51:44 · 50 阅读 · 0 评论 -
字符串-反转字符串II
题目https://leetcode-cn.com/problems/reverse-string-ii/题目的意思其实概括为 每隔2k个反转前k个,尾数不够k个时候全部反转。而不要再去判断是不是2k。思路与反转字符串基本思路一致。有区别的就是要如何对有关k的各种情况的选择。一些同学可能为了处理逻辑:每隔2k个字符的前k的字符,写了一堆逻辑代码或者再搞一个计数器,来统计2k,再统计前k个字符。其实在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判原创 2022-03-07 09:46:55 · 75 阅读 · 0 评论 -
字符串-反转字符串
题目https://leetcode-cn.com/problems/reverse-string/思路这道题非常简单,日常双指针 public void reverseString(char[] s) { int left = 0; int right = s.length-1; char temp ; while(left<right){ temp = s[left];原创 2022-03-07 08:11:28 · 46 阅读 · 0 评论 -
哈希表总结
子曰:温故而知新,不温故前面学的就全tnnd的忘了。哈希表的介绍哈希表用来快速判断一个元素是否出现集合里。例如要查询一个名字是否在这所学校里。要枚举的话时间复杂度是O(n)O(n)O(n),但如果使用哈希表的话, 只需要O(1)O(1)O(1)就可以做到。我们只需要初始化把这所学校里学生的名字都存在哈希表里,在查询的时候通过索引直接就可以知道这位同学在不在这所学校里了。将学生姓名映射到哈希表上就涉及到了hash function ,也就是哈希函数。如果学生的数量大于哈希表的大小怎么办,此原创 2022-03-06 09:15:10 · 124 阅读 · 0 评论 -
哈希表(双指针)-四数之和
题目https://leetcode-cn.com/problems/4sum/思路四数之和与三数之和是一个思路,都是使用双指针法, 基本解法就是在三数之和 的基础上再套一层for循环。但是有一些细节需要注意,例如: 不要判断nums[k] > target 就返回了,三数之和 可以通过 nums[i] > 0 就返回了,因为 0 已经是确定的数了,四数之和这道题目 target是任意值。比如下图的情况:三数之和的双指针解法是一层for循环num[i]为确定值,然后循环内有left原创 2022-03-05 13:23:11 · 114 阅读 · 0 评论 -
哈希表(双指针)-三数之和
题目https://leetcode-cn.com/problems/3sum/解法一-哈希表想法和之前的四数相加一样。两个for得到所有数字相加的可能,然后看数组中的哪个数字是他们的相反数。最后还要去重。这样是非常费时的,很容易超时,所以我们换一种解法。解法二-双指针算法流程:对于数组长度 n,如果数组为 null 或者数组长度小于 3,返回 []。对数组进行排序。遍历排序后数组:若 nums[i]>0:因为已经排序好,所以后面不可能有三个数加和等于 0,直接返回结果。对于原创 2022-03-05 09:17:57 · 208 阅读 · 0 评论 -
哈希表-赎金信
题目https://leetcode-cn.com/problems/4sum-ii/解法一先把构成数组插入map中,和之前两数之和一样,key是字母。value是次数。遵循着HashMap的key是不能重复的,如果有相同的key,最后一个key对应的value会把前一个相同的value覆盖掉。循环判断r中元素,m中是否有,若有value-1,若没有即返回false。若value<0也返回falseString和char区别很大, char是基本数据类型,而String是个类,属于引用数原创 2022-03-04 19:21:20 · 436 阅读 · 0 评论 -
哈希表-四数相加II
题目https://leetcode-cn.com/problems/4sum-ii/思路第一反应必是暴力,四个for循环解决。但据说运行的时候甚至会卡住,毕竟是O(n的四次方)。那么就想到用数学中相反数的方式。用HashMap先存入两个数组相加后的值存入到key中,其中可能会有重复的key,value就用于记录各个key对应的次数。显然两组是时间复杂度最低的。O(n的平方)再用后两组计算其中的值,找到有-(和)=之前map存入的值,而输出的个数由各个value相加来决定eg: 前两组key原创 2022-03-04 10:16:18 · 158 阅读 · 0 评论 -
哈希表-两数之和
题目https://leetcode-cn.com/problems/two-sum/解法-暴力作为leetcode第一题,高低给他整个暴力解public static int[] twoSum(int[] nums, int target) { List<Integer> result=new ArrayList<Integer>(); for(int i=0; i<nums.length; i++){ int原创 2022-03-03 23:14:59 · 447 阅读 · 0 评论 -
哈希表-快乐数
哈希表都是用来快速判断一个元素是否出现集合里。题目https://leetcode-cn.com/problems/happy-number/思路对取数值各个位上的单数操作熟悉(先模10取余得到个位数。。。再除10整体数字右移)判断这个n是否重复出现,如果重复了就是return false, 否则一直找到n为1为止。想到用set的contains方法先判断有没有n,再加到set里面,最后再得到n的下一个值代码class Solution { public boolean is原创 2022-03-03 10:35:28 · 104 阅读 · 0 评论 -
哈希表-两个数组的交集
题目https://leetcode-cn.com/problems/intersection-of-two-arrays/思路在有思路之前,要知道HashSet的一些性质:底层数据结构是哈希表存储元素的顺序和遍历获取出来的顺序可能不一致没有索引集合中不能存储重复元素代码验证知道性质后,思路就变得简单先把第一个数组加进set,然后里面就是不重复的数字。在加第二个数组放进set的时候,用contains方法判断是否有一样的元素,再放进set。用result数组装下第二个se原创 2022-03-02 21:18:21 · 351 阅读 · 0 评论 -
哈希表-有效的字母异位词
题目https://leetcode-cn.com/problems/valid-anagram/给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。示例 1:输入: s = “anagram”, t = “nagaram”输出: true示例 2:输入: s = “rat”, t = “car”输出: false提示:1 <= s.length, t.length &原创 2022-03-02 14:19:51 · 341 阅读 · 0 评论 -
链表-环形链表 II
环形链表 IIhttps://leetcode-cn.com/problems/linked-list-cycle-ii/解题思路:这类链表题目一般都是使用双指针法解决的,例如寻找距离尾部第K个节点、寻找环入口、寻找公共尾部入口等。算法流程:代码实现/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * ListNode(int x) {原创 2022-03-01 22:57:48 · 204 阅读 · 0 评论 -
链表-链表相交
题目https://leetcode-cn.com/problems/intersection-of-two-linked-lists-lcci/给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。图示两个链表在节点 c1 开始相交:题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须 保持其原始结构 。错误的理解了题意交点不是数值相等,而是指针相等。双指针法这道题更像是一个数学题原创 2022-03-01 09:55:29 · 170 阅读 · 0 评论 -
链表-删除链表的倒数第N个节点(双指针法)
题目https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。进阶:你能尝试使用一趟扫描实现吗?示例 1:19.删除链表的倒数第N个节点输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]示例 2:输入:head = [1], n = 1 输出:[]示例 3:输入:head = [1,2], n = 1 输出:[1]原创 2022-03-01 08:58:09 · 102 阅读 · 0 评论 -
链表-两两交换链表中的节点
1. 虚拟头节点在反转列表一文中就有用到虚拟头节点(reverseHead),只不过是在定义链表的时候直接用的,目的就是用一个不含任何有效数据的head来方便我们对链表进行操作。唯一需要注意的是最后return的是虚拟头节点的下一个节点。2.两两交换链表中的节点题目:https://leetcode-cn.com/problems/swap-nodes-in-pairs/给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。解原创 2022-02-28 08:40:05 · 331 阅读 · 0 评论 -
链表-反转链表
题目:https://leetcode-cn.com/problems/reverse-linked-list/题意:反转一个单链表。示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL原创 2022-02-27 13:42:34 · 79 阅读 · 0 评论 -
链表的基本操作+设计链表
1.题目题目:https://leetcode-cn.com/problems/design-linked-list/在链表类中实现这些功能:get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。addAtIndex(index,val):在链表中的第 index 个节原创 2022-02-27 09:49:06 · 427 阅读 · 0 评论 -
链表-移除链表元素
1.链表java定义public class ListNode { // 结点的值 int value; // 下一个结点 ListNode next; // 节点的构造函数(无参) public ListNode() { } // 节点的构造函数(有一个参数) public ListNode(int value) { this.value = value; }}2.移除链表元素题目:https://l原创 2022-02-26 20:23:04 · 313 阅读 · 0 评论 -
数组-螺旋矩阵II
螺旋矩阵II题目:https://leetcode-cn.com/problems/spiral-matrix-ii/给定一个正整数 n,生成一个包含 1 到 n2n^2n2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。示例:输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]当 num <= tar 时,始终按照 从左到右 从上到下 从右到左 从下到上 填入顺序循环,每次填入后:执行 num += 1:得到下一个需要填入的数字;更原创 2022-02-26 08:41:45 · 185 阅读 · 0 评论 -
数组-长度最小的子数组
题目:https://leetcode-cn.com/problems/minimum-size-subarray-sum/长度最小的子数组给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。示例:输入:s = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3] 是该条件下的长度最小的子数组。暴力破解使用两个 for 循环,一个 for 循环固定一个数字比原创 2022-02-25 11:14:51 · 126 阅读 · 0 评论 -
数组-有序数组的平方
题目链接:https://leetcode-cn.com/problems/squares-of-a-sorted-array/给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。示例 1: 输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100]示例 2: 输入:nums = [-7,-3,2,3,11] 输出原创 2022-02-24 09:30:39 · 85 阅读 · 0 评论 -
数组-移除元素
题目:https://leetcode-cn.com/problems/remove-element/给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。你可以原创 2022-02-24 08:11:45 · 824 阅读 · 0 评论 -
数组-二分查找
做题地址:https://leetcode-cn.com/problems/binary-search/代码先贴上本人的代码,代码可以完美得到示例答案,但仅为其中一种解法,也是最为基础的解法。(后面的两个if,建议编程else if的形式)class Solution { public int search(int[] nums, int target) { int left = 0; int right = nums.length - 1; w原创 2022-02-23 12:34:55 · 397 阅读 · 0 评论