Java算法
文章平均质量分 61
Java算法学习笔记
徐漠漠
这个作者很懒,什么都没留下…
展开
-
LeetCode226.翻转二叉树
/ 交换tmp节点的左右子树//如果当前节点的左子树不为空,则放入队列等待后续= null) {//如果当前节点的右子树不为空, 则放入队列等待后续= null){原创 2024-04-01 15:49:09 · 183 阅读 · 0 评论 -
LeetCode104.二叉树的最大深度
给定一个二叉树 root ,返回其最大深度。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。示例 1:输入:root = [3,9,20,null,null,15,7] 输出:3 示例 2:输入:root = [1,null,2] 输出:2。原创 2024-04-01 14:36:07 · 285 阅读 · 0 评论 -
LeetCode102.二叉树的层序遍历
给你二叉树的根节点 root ,返回其节点值的 层序遍历。(即逐层地,从左到右访问所有节点)。输入:root = [] 输出:[]原创 2024-03-22 12:39:02 · 691 阅读 · 0 评论 -
144.二叉树的前序遍历
确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。原创 2024-03-20 00:50:14 · 223 阅读 · 0 评论 -
347.前k个高频元素
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。示例 1:输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2] 示例 2:输入: nums = [1], k = 1 输出: [1]提示:1 <= nums.length <= 105 k 的取值范围是 [1, 数组中不相同的元素的个数]题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。原创 2024-03-18 17:06:46 · 297 阅读 · 0 评论 -
239.滑动窗口最大值
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k个数字。滑动窗口每次只向右移动一位。返回 滑动窗口中的最大值。原创 2024-03-18 16:09:48 · 516 阅读 · 0 评论 -
20.有效的括号
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。示例 1:输入:s = “()” 输出:true 示例 2:输入:s = “()[]{}” 输出:true 示例 3:输入:s = “(]” 输出:false提示:1 <= s.length <= 104 s 仅由括号 ‘()[]{}’ 组成。原创 2024-03-18 00:51:19 · 322 阅读 · 0 评论 -
225.用队列实现栈
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。实现 MyStack 类:void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回栈顶元素。int top() 返回栈顶元素。boolean empty() 如果栈是空的,返回 true;否则,返回 false。原创 2024-03-15 22:53:09 · 215 阅读 · 0 评论 -
232.用栈实现队列
在队列中,新元素被添加到队列的尾部,而元素的移除操作发生在队列的头部。输入: [“MyQueue”, “push”, “push”, “peek”, “pop”, “empty”] [[], [1], [2],void push(int x) 将元素 x 推到队列的末尾 int pop() 从队列的开头移除并返回元素 int peek()[], [], []] 输出: [null, null, null, 1, 1, false]双端队列是一种特殊的队列,允许在队列的两端进行插入和删除操作。原创 2024-03-15 22:38:34 · 311 阅读 · 0 评论 -
LeetCode28.找出字符串中第一个匹配项
KMP原创 2024-03-14 16:17:51 · 769 阅读 · 0 评论 -
151.反转字符串中的单词
给你一个字符串 s ,请你反转字符串中 单词 的顺序。单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。注意:输入字符串s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。原创 2024-03-13 23:51:58 · 366 阅读 · 0 评论 -
LeetCode541 - 反转字符串二
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。如果剩余字符少于 k 个,则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。示例 1:输入:s = “abcdefg”, k = 2 输出:“bacdfeg” 示例 2:输入:s = “abcd”, k = 2 输出:“bacd”原创 2024-03-13 19:05:32 · 279 阅读 · 0 评论 -
LeetCode344 -反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。原创 2024-03-13 18:28:00 · 269 阅读 · 0 评论 -
LeetCode18.四数之和
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target。请你找出并返回满足下述全部条件且不重复的四元组[nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):0 <= a, b, c, d < n a、b、c 和 d 互不相同 nums[a] + nums[b] + nums[c] +nums[d] == target 你可以按 任意顺序 返回答案。原创 2024-03-13 16:31:49 · 298 阅读 · 0 评论 -
LeetCode15.三数之和
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i!= j、i!= k且 j!= k ,同时还满足 nums[i] + nums[j] + nums[k] == 0。请你返回所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。示例 1:输入:nums = [-1,0,1,2,-1,-4] 输出:[[-1,-1,2],[-1,0,1]] 解释: nums[0] +原创 2024-03-13 12:59:55 · 817 阅读 · 0 评论 -
LeetCode383 —赎金信
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。如果可以,返回 true;否则返回 false。magazine 中的每个字符只能在 ransomNote 中使用一次。原创 2024-03-13 00:11:36 · 470 阅读 · 0 评论 -
LeetCode454 四数相加
在遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。输入:nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2] 输出:2。输入:nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0] 输出:1。遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中。是键,表示两个数组元素的和。原创 2024-03-12 22:10:51 · 425 阅读 · 0 评论 -
LeetCode1.两数之和
因为是第一题所以热度比较高,有很多种解法给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] ==9 ,返回 [0, 1]。原创 2024-03-12 16:12:26 · 502 阅读 · 0 评论 -
LeetCode202.快乐数
编写一个算法来判断一个数 n 是不是快乐数。「快乐数」 定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1,那么这个数就是快乐数。如果 n 是 快乐数 就返回 true;不是,则返回 false。示例 1:输入:n = 19 输出:true 解释: 12 + 92 = 82 82 + 22 = 68 62 + 82 = 100 12 + 02输入:n = 2 输出:false。原创 2024-03-11 20:15:37 · 472 阅读 · 0 评论 -
LeetCode349.两个数组的交集
给定两个数组 nums1 和 nums2 ,返回 它们的交集。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序。示例 1:输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2] 示例 2:输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[9,4] 解释:[4,9] 也是可通过的提示:1000。原创 2024-03-10 22:35:54 · 300 阅读 · 0 评论 -
LeetCode242.有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。示例 1:输入: s = “anagram”, t = “nagaram” 输出: true 示例 2:输入: s = “rat”, t = “car” 输出: false提示:1原创 2024-03-10 18:46:03 · 306 阅读 · 0 评论 -
哈希表理论基础
通俗来说数组就是一张哈希表哈希表中关键码就是数组的索引下标,通过下标直接访问数组中的元素eg:查询一个名字是否在这所学校中使用枚举的时间复杂度是O(n)使用哈希表的时间复杂度O(1)原创 2024-03-10 17:56:59 · 212 阅读 · 0 评论 -
LeetCode142环形链表
有点难,想了好久最后还是看了答案给定一个链表的头节点 head ,返回链表开始入环的第一个节点。如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos不作为参数进行传递,仅仅是为了标识链表的实际情况。不允许修改 链表。原创 2024-03-09 16:28:09 · 486 阅读 · 0 评论 -
LeetCode24.两两交换链表节点
这道题,重点在于理清楚各个指针之间的关系。链表的题一定要注意断链和连接的顺序,有时候需要申请新的节点来保存某个节点,给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。原创 2024-03-09 11:36:23 · 259 阅读 · 0 评论 -
206.反转链表
复制 prev = 4 -> 3 -> 2 -> 1 -> null cur = null temp = null 循环结束,返回 prev。因此,经过 reverseList 函数的执行,原始链表 1 -> 2 -> 3 -> 4 -> null 被反转为 4 -> 3 -> 2。这个演示过程清楚地展示了算法的每一个步骤,以及三个指针 prev、cur 和 temp。通过这种逐步演示,相信你能更好地理解和掌握单链表反转的实现方式。看答案没看懂,找了gpt演示过程,一目了然,不得不感慨还没就业已经失业。原创 2024-03-09 00:19:35 · 367 阅读 · 0 评论 -
707.设计链表
val 的节点插入到链表中下标为 index 的节点之前。如果 index 等于链表的长度,那么该节点会被追加到链表的末尾。// 链表变为 1->2->3 myLinkedList.get(1);val 的节点追加到链表中作为链表的最后一个元素。输入 [“MyLinkedList”, “addAtHead”, “addAtTail”, “addAtIndex”, “get”,“deleteAtIndex”, “get”] [[], [1], [3], [1, 2], [1], [1], [1]] 输出。原创 2024-03-09 00:01:47 · 324 阅读 · 1 评论 -
203移除链表元素
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点。原创 2024-03-08 22:14:46 · 295 阅读 · 1 评论 -
链表基础学习
/节点的值int val;//下一个节点//节点的构造函数(无参数)//节点的构造函数(有一个参数)//节点的构造函数(有两个参数)C++版// 单链表int val;// 节点上存储的元素// 指向下一个节点的指针ListNode(int x) : val(x), next(NULL) {} // 节点的构造函数//节点的构造函数也可以不定义,C++默认生成一个构造函数//但是C++的默认构造函数并不会初始化任何成员变量。原创 2024-03-08 14:46:24 · 149 阅读 · 1 评论 -
Java StringBuffer与 StringBuilder学习笔记
下面这种方法是错误的:👇👇👇。原创 2024-03-08 13:21:51 · 182 阅读 · 1 评论 -
Java基础语法
可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性,Java中每一个对象都可以作为锁,这是synchronized实现同步的基础。像其他语言一样,Java可以使用修饰符来修饰类中方法和属性。原创 2024-03-08 12:24:30 · 269 阅读 · 1 评论