- 博客(35)
- 收藏
- 关注
原创 java线程共享模型之管程(synchronized原理、wait-notify、park方法)
sychronized各种锁的内容整理,wait-notify方法、park&unpark方法整理。
2024-12-20 20:10:43
958
原创 leetcode 之 双指针(java)(2)
先遍历一个数组,然后使用u作为下标记录,因为数组本身就已经有序了,所以,nums[u - k]就可以记录当前数字是否已经够两个了,然后一直遍历,返回最终结果。请注意,输入数组是以**「引用」**方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。** 删除重复出现的元素,使得出现次数超过两次的元素。 该方法是题解区一位大佬的,不得不说,牛逼!不要使用额外的数组空间,你必须在。,返回删除后数组的新长度。
2024-12-08 12:05:38
447
1
原创 leetcode 之 双指针(java)(1)
判断时候的状态转移方程就是dp[l] [r] = dp[l + 1] [r - 1] == true?) ,因此我们先进行排序,时间复杂度为(n log n ),随后外层套一个循环,之后,内部使用双指针,时间复杂度为O(n。我们上面思路有很大问题,可以改用动态规划的方式,通过空间换取时间。该题目如果使用最暴力的三重循环,那么时间复杂度为O(n。该步减少了向中间遍历的时间损耗。中选出三个整数,使它们的和与。假定每组输入只存在恰好一个解。本文就是使用中心扩散法。总时间复杂度为O(n。
2024-12-07 11:07:37
399
1
原创 leetcode 之 二分查找(java)(5)
这道题,它有一个性质,每次旋转之后,分为两个有序区间,同时左边区间的所有数一定比第二个区间的最后一个数要大,同时右边区间是一个递增数组,因此,我们可以很明显的,单独取出来num[n - 1]这个数,然后对剩下的区间使用二分进行求。使用二分对[ l, r ] 区域求出结果是 target - nums[i]的值,最后返回 [ i + 1, mid + 1 ]即为正确结果。,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。本题目的话,还是使用二分,但是首先要明确二分的条件,的形式返回这两个整数的下标。
2024-12-05 11:18:15
360
原创 leetcode 之 二分查找 (java)(4)
该题目就是用取值范围作为边界。取到的mid作为标志,每次都遍历数组中的所有数,与mid比较,使用cnt记录。统计 <= nums[i]的值的个数,如果大于 (mid - l + 1) 说明重复数在左边区间,r = mid缩小查找范围,否则在右边,对于数组相关的题目,如果使用二分,首先要提取某种可以比较的性质,使用二分时的边界选取有两种情况。该题目,分析使用二分法,暴力枚举。),可知至少存在一个重复的整数。,你要判断是否存在两个整数。你设计的解决方案必须。
2024-12-04 11:33:45
464
原创 leetcode 之 二分查找(java)(3)
该题目与其上一道题目的区别是,该题目数组中有重复的数,因此,在判断的时候会有一些不同。,请你编写一个函数来判断给定的目标值是否存在于数组中。,其中每行和每列元素均按升序排序,找到矩阵中第。题目中说到,每行和每列元素均按升序排序,已知存在一个按非降序排列的整数数组。你必须尽可能减少整个操作步骤。你必须找到一个内存复杂度优于。,数组中的值不必互不相同。在预先未知的某个下标。
2024-12-03 10:27:19
439
原创 leetcode 之 二分查找(java)(2)
首先,题目要求查询target是否在矩阵中,同时矩阵是有序存储的,从左到右,从上到下增大,即右下 > 左上。令 l = -1, r = n,即恰好在矩阵长度左右范围 + 1,因为是开区间,不包含l和r本身。思路:①、我们先遍历矩阵的行,确认target所处的范围是在哪一行,使用idx记录。闭区间不需要添加判断,因为l和r有 + 1和 - 1的权值变化,最终会自己跳出循环。我们可以明显的看出,如果想要使用二分,就需要找有序的数组,此时我们看到,我们使用全开区间,即(l, r) 表示范围,
2024-12-02 12:55:52
997
原创 2024/9/23 leetcode 25题 k个一组翻转链表
给你链表的头节点head,每k个节点一组进行翻转,请你返回修改后的链表。k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
2024-09-23 13:00:24
433
原创 2024/9/22 leetcode 128题 283题
longestidx就是最终结果,每次遍历nums,然后如果该数的前一位不存在,说明可以从这个数开始统计连续区间,currentnum就是统计每一段区间长度,与最终结果取最大值,从而使得结果最大。本题目就是先使用一个set数组遍历原数组,去重,然后正式开始我们的逻辑。,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。本题题目就是双指针,我们直接看图,就用第一个样例模拟。移动到数组的末尾,同时保持非零元素的相对顺序。,必须在不复制数组的情况下原地对数组进行操作。给定一个未排序的整数数组。
2024-09-22 11:00:00
1001
原创 2024/9/22 leetcode 第1题 第49题
本题嘛,还是哈希,就是转换一下思路,ump中,我们使用string对应一个vector,string就是排序后的字符串,然后我们将这个排序后的字符串对应的原数组中的字符串添加进去。排序后的字符就是我们哈希的key,这个也体现了哈希的思想。思路就是从前往后遍历nums,然后每次从res中寻找是否存在另一个(target - 当前数字)的值,如果存在就返回这两个值,如果遍历过后,依然没有找到,说明结果不存在,返回空即可。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
2024-09-22 07:00:00
884
原创 2024/9/21 leetcode 19题 24题
这个方法原理就是,先然right移动n,那么之后left和right同步移动,相当于移动(m - n)次,这样left就处于了我们要删除节点的前一个结点,从而简化问题。就可以求解,同时我们需要注意,需要对left->next进行delete操作,防止链表中只存在一个结点的情况。给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。然后此时我们发现left->next就是要删除的结点,然后我们直接left->next = left->next ->next;个结点,并且返回链表的头结点。
2024-09-21 11:19:19
1017
原创 2024/9/21 leetcode 21.合并两个有序链表 2.两数相加
将两个升序链表合并为一个新的链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。[][0]l2。
2024-09-21 10:02:17
1346
原创 (2)leetcode 234.回文链表 141.环形链表
我们将mid这个节点记录下来,然后将这段链表反转,以下是反转的逻辑,最后我们将pre返回就是结果,就是通过中间变量tem记录位置从而实现链表的反转。此时就很简单了,我们两边遍历head和head2进行比较,一旦不相同就返回false,比较结束没有返回false说明是回文链表,返回true.举例,像这个,我们从head开始遍历,每次遍历的时候,遍历过一遍就存入set, 如果有环的话,遍历到重复的结点时,就返回true。像这个,遍历到最后就是到了NULL,跳出循环,然后返回false.
2024-09-20 16:06:24
537
2
原创 算法总结归纳(第三天)(普通二叉树(非搜索树)总结)
最重要的二叉树的前中后序遍历,以及各种递归,迭代实现方法,还有二叉树属性,修改构造,合并二叉树等问题。
2024-01-16 20:32:19
1542
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人