![](https://img-blog.csdnimg.cn/20190927151053287.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java算法笔记
算法
晚风时亦鹿
我宁愿犯错 也不愿什么都不做
展开
-
LeetCode——237. 删除链表中的节点(非递归)快慢指针
地址:https://leetcode.cn/problems/linked-list-cycle/本题解题思路主要是用快慢指针,快指针一次走两步,慢指针一次走两步.原创 2023-01-20 00:47:47 · 135 阅读 · 0 评论 -
LeetCode单向链表——剑指 Offer II 024. 反转链表(递归和迭代)
在遍历链表时,将当前节点的next指针改为指向上一个节点,由于节点没有引用其前一个节点因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点,最后返回新的头引用。地址: https://leetcode.cn/problems/UHnkqh/原创 2023-01-20 00:35:48 · 170 阅读 · 1 评论 -
LeetCode单向链表——删除链表中的节点
解法思路:idea:node是被删除的节点,将第二个节点的值修改为第3个节点的值,即将 节点5的值修改为1 然后将第三个节点的值指向空。地址:https://leetcode.cn/problems/delete-node-in-a-linked-list。原创 2023-01-20 00:27:31 · 174 阅读 · 0 评论 -
剑指Offer77题LeetCode链表排序 (归并排序的两个方法)
找到链表的中点,以中点为分界,将链表拆分成两个子链表。寻找链表的中点可以使用快慢指针的做法,快指针每次移动 2 步,慢指针每次移动 1 步,当快指针到达链表末尾时,慢指针指向的链表节点即为链表的中点。将两个排序后的子链表合并,得到完整的排序后的链表。递归的终止条件是链表的节点个数小于或等于 1,即当链表为空或者链表只包含 1个节点时,不需要对链表进行拆分和排序。哑结点其实就是放在第一个存放数据结点之前、头结点之后的结点。加入哑结点之后就可以使所有数据结点都有前驱结点,这样就会方便执行链表的一些操作。原创 2023-01-12 00:20:12 · 160 阅读 · 0 评论 -
LeetCode每日两题02:深搜/广搜 岛屿的最大面积 (均1200道)
如果我们在一个土地上,以 44 个方向探索与之相连的每一个土地(以及与这些土地相连的土地),那么探索过的土地总数将是该连通形状的面积。为了确保每个土地访问不超过一次,我们每次经过一块土地时,将这块土地的值置为 00。这样我们就不会多次访问同一土地。解题思路:我们想知道网格中每个连通形状的面积,然后取最大值。...原创 2022-08-16 15:05:43 · 187 阅读 · 0 评论 -
LeetCode每日两题01:图像渲染 (均1200道) 方法:深搜/广搜 数组
解题思路:我们从给定的起点开始,进行广度优先搜索。每次搜索到一个方格时,如果其与初始位置的方格颜色相同,就将该方格加入队列,并将该方格的颜色更新,以防止重复入队。因为初始位置的颜色会被修改,所以我们需要保存初始位置的颜色,以便于之后的更新操作。...原创 2022-08-16 15:03:23 · 1329 阅读 · 0 评论 -
LeetCode每日两题02:字符串的排列 (均1200道)方法:哈希表-双指针-滑动窗口
依次尝试固定以s2中的每一个位置 l 作为左端点开始的len1长度的子串s2[l …解题思路:客观上来说,最终的答案如果是true,则s2中必然存在某个位置 i 使得以 i 开始的子串s2[i …i+len1)是s1的排列。如果固定 l 做左端点,尝试失败,继续尝试 l+1 位置,【左右边界都不需要回退】,这是滑动窗口的前提。滑动窗口内每一个右边界字符进入窗口后,【还账】:charCount[str2[r] - ‘a’]–如果某个字符多还了(变成负值),即尝试失败,开始尝试下一个左端点(l++);...原创 2022-08-14 16:04:29 · 167 阅读 · 0 评论 -
LeetCode每日两题01:无重复字符最长子串 (均1200道)
解题思路:首先需要判断字符是否存在,其次此题应用滑动窗口来解决,利用哈希表来存储字符串,设置左值和最值,循环遍历字符串,如果索引处的i值在map里面包含了,那么通过left的形式移除元素,并且往map里面传入所有的字符串, 并且返回数组长度最大值。...原创 2022-08-14 15:54:21 · 151 阅读 · 0 评论 -
LeetCode每日两题02:删除链表的倒数第N个结点(均1200道)方法:链表-双指针
思路:一种容易想到的方法是,我们首先从头节点开始对链表进行一次遍历,得到链表的长度 LL。随后我们再从头节点开始对链表进行一次遍历,当遍历到第 L-n+1L−n+1 个节点时,它就是我们需要删除的节点。为了方便删除操作,我们可以从哑节点开始遍历 L-n+1L−n+1 个节点。当遍历到第 L-n+1L−n+1 个节点时,它的下一个节点就是我们需要删除的节点,这样我们只需要修改一次指针,就能完成删除操作。...原创 2022-08-11 19:56:58 · 154 阅读 · 0 评论 -
LeetCode每日两题01:链表的中间节点 (均1200道) 方法:链表-双指针
解题思路:链表的缺点在于不能通过下标访问对应的元素。因此我们可以考虑对链表进行遍历,同时将遍历到的元素依次放入数组 A 中。如果我们遍历到了 N 个元素,那么链表以及数组的长度也为 N,对应的中间节点即为 A[N/2]。...原创 2022-08-11 19:53:58 · 173 阅读 · 0 评论 -
LeetCode每日两题02:反转字符串中的单词 (均1200道)
使用字符确定c包含空格的时候 则向第一个承载反转字符串内添加反转单词的数据并且添加空格,然后new一个新的添加反转字符串的函数。最后return返回结果。解题思路:运用两个StringBuilder,一个用来承载反转字符串 一个是用来记录反转单词。...原创 2022-08-10 13:52:37 · 1209 阅读 · 0 评论 -
LeetCode每日两题01:反转字符串 (均1200道)方法:双指针
解题思路:利用双指针法,对数组确定左值left 和右值right然后两两位数进行交换,每次循环完毕left向右移位,right向左移位,原创 2022-08-10 11:52:24 · 1443 阅读 · 0 评论 -
LeetCode每日两题02:两数之和 II - 输入有序数组 (均1200道)
解题思路:一般给定的数组或链表是有序的话就要相当双指针了,因为此时左指针向右,右指针向左的移动都代表着数字的增大或减小,这样的移动s 包含信息的。原创 2022-08-09 17:31:06 · 401 阅读 · 0 评论 -
LeetCode每日两题01:移动零 (均1200道)方法:双指针
解题思路:我们创建两个指针i和j,第一次遍历的时候指针j用来记录当前有多少非0元素。即遍历的时候每遇到一个非0元素就将其往数组左边挪,第一次遍历完后,j指针的下标就指向了最后一个非0元素下标。第二次遍历的时候,起始位置就从j开始到结束,将剩下的这段区域内的元素全部置为0。解题思路:使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移。......原创 2022-08-09 16:54:22 · 184 阅读 · 0 评论 -
LeetCode每日两题02:轮转数组 (均1200道)
解题思路:使用额外的数组 ,通过 arr[(i+k)%n]=nums[i]等式进行位置转换。并且使用arraycopy函数 将额外数组复制到本数组中。原创 2022-08-08 12:18:42 · 120 阅读 · 0 评论 -
LeetCode每日两题01:有序数组的平方 (均1200道)方法:双指针
解题思路:最简单的方法就是将数组 nums 中的数平方后直接排序然后放在另一个新建的数组中。原创 2022-08-08 11:57:56 · 78 阅读 · 0 评论 -
LeetCode每日一题:搜索插入位置 (均1200道)方法:二分查找
每次根据 nums[mid] 和 target 之间的大小进行判断,相等则直接返回下标,nums[mid] < target 则 left 右移,nums[mid] > target 则 right 左移。如果该题目暴力解决的话需要 O(n)O(n) 的时间复杂度,但是如果二分的话则可以降低到 O(logn)O(logn) 的时间复杂度。整体思路和普通的二分查找几乎没有区别,先设定左侧下标 left 和右侧下标 right,再计算中间下标 mid。查找结束如果没有相等值则返回 left,该值为插入位置。..原创 2022-08-07 18:12:07 · 113 阅读 · 0 评论 -
LeetCode每日两题02:第一个错误的版本 (均1200道)方法:二分查找
设定左右边界之后,每次我们都依据左右边界找到其中间的版本,检查其是否为正确版本。如果该版本为正确版本,那么第一个错误的版本必然位于该版本的右侧,我们缩紧左边界;否则第一个错误的版本必然位于该版本及该版本的左侧,我们缩紧右边界。注意到一个性质:当一个版本为正确版本,则该版本之前的所有版本均为正确版本;当一个版本为错误版本,则该版本之后的所有版本均为错误版本。这样我们每判断一次都可以缩紧一次边界,而每次缩紧时两边界距离将变为原来的一半,因此我们至多只需要缩紧 O(\log n)O(logn) 次。......原创 2022-08-07 18:03:24 · 65 阅读 · 0 评论 -
LeetCode每日两题01:二分查找 (均1200道)
解题思路:首先设置左右值及中值 从中间开始向两边扩散查找,条件二:如果中间值大于目标值则下一次循环条件使中值往左走。条件三:如果中间值小于目标值那么下一次循环条件往右走。条件一:如果中间值与目标值相等则返回中间值。...原创 2022-08-07 17:34:57 · 225 阅读 · 0 评论 -
LeetCode每日一题02:存在重复元素 (均1200道)
解题思路:在对数字从小到大排序之后,数组的重复元素一定出现在相邻位置中。因此,我们可以扫描已排序的数组,每次判断相邻的两个元素是否相等,如果相等则说明存在重复的元素。原创 2022-08-06 18:58:37 · 124 阅读 · 0 评论 -
LeetCode每日两题01:旋转数组(均1200道)
解题思路: 我们可以使用额外的数组来将每个元素放至正确的位置。用 nn 表示数组的长度,我们遍历原数组,将原数组下标为 ii 的元素放至新数组下标为 (i+k)\bmod n(i+k)modn 的位置,最后将新数组拷贝至原数组即可。...原创 2022-08-06 18:37:23 · 142 阅读 · 0 评论 -
LeetCode每日两题02:买股票的最佳时机 (均1200道)
代码】LeetCode每日两题02:买股票的最佳时机 (均1200道)原创 2022-08-06 12:36:51 · 75 阅读 · 2 评论 -
LeetCode每日两题01:删除排序数组中的重复项 (均1200道)
解题思路:因为数组是排序的,只要是相同的肯定是挨着的,我们只需要遍历所有数组,然后前后两两比较,如果有相同的就把后面的给删除。上一位和下一位两两比较 下一位和下下一位两两比较。...原创 2022-08-06 12:25:56 · 61 阅读 · 0 评论 -
LeetCode每日两题02:最长回文子串 (均1200道)
我们用一个 boolean dp[l][r] 表示字符串从 i 到 j 这段是否为回文。试想如果 dp[l][r]=true,我们要判断 dp[l-1][r+1] 是否为回文。只需要判断字符串在(l-1)和(r+1)两个位置是否为相同的字符,是不是减少了很多重复计算。解题思路:中心扩散的方法,其实做了很多重复计算。状态转移方程,dp[l][r]=true 并且(l-1)和(r+1)两个位置为相同的字符,此时 dp[l-1][r+1]=true。初始状态,l=r 时,此时 dp[l][r]=true。....原创 2022-08-05 13:47:07 · 117 阅读 · 0 评论 -
LeetCode每日两题01:滑动窗口-无重复字符的最长样子
什么是滑动窗口:其实就是一个队列,比如例题中的 abcabcbb,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求。所以,我们要移动这个队列!我们只要把队列的左边的元素移出就行了,直到满足题目要求!一直维持这样的队列,找出队列出现最长的长度时候,求出解!......原创 2022-08-05 13:10:56 · 113 阅读 · 0 评论 -
LeetCode每日两题02:回文数 (均1200道)
代码】LeetCode每日五题02:回文数 (均1200道)原创 2022-08-04 19:54:20 · 113 阅读 · 0 评论 -
LeetCode每日两题01:翻转单词前缀 (均1200道)
解题思路:利用函数indexOf查找到ch的索引位置,并且将字符串word转换为新的字符数组arr,此题最好的方法是使用截取,所以需要定义左值和右值,左值始终为0,右值为索引值,然后左值和右值进行循环三次,因截取的位置为逆序,所以需要left++与right–互相交换位置 并指定数组的类型为String 从而得到我们的答案。解题思路:首先循环遍历字符串word,然后通过charAt(i)==ch 找到指定索引。.........原创 2022-08-04 16:23:22 · 245 阅读 · 0 评论 -
LeetCode每日两题01:两数之和 (均1200题)
注意:nums数组中的元素充当key,其索引充当value,由于在Map集合的映射关系中,key是唯一的,value是可重复的(即不同key可以对应相同的value,但key要求互不相同,故允许根据key取value,不允许根据value取其key),所以这样做便于根据值target-nums[i]取其索引,这道题索引是我们想要的答案。如果不存在,则以nums[i]为键,其索引i为值,放入HashMap。.........原创 2022-08-03 16:28:36 · 116 阅读 · 0 评论 -
Java算法笔记08:快速排序
代码】Java算法笔记08快速排序。原创 2022-08-02 11:43:28 · 51 阅读 · 0 评论 -
Java算法笔记08:快速排序
代码】Java算法笔记08快速排序。原创 2022-07-29 19:15:45 · 69 阅读 · 0 评论 -
Java算法笔记07:买股票的最佳时机
代码】Java算法笔记07买股票的最佳时机。原创 2022-07-29 16:15:00 · 355 阅读 · 0 评论 -
Java算法笔记06:删除有序数组中的重复项
代码】Java算法笔记06删除有序数组中的重复项。原创 2022-07-29 16:07:43 · 175 阅读 · 0 评论 -
Java算法笔记05:线性表-顺序表
代码】Java算法比较05线性表-顺序表。原创 2022-07-28 22:16:26 · 349 阅读 · 0 评论 -
Java算法笔记04:希尔排序
代码】Java算法比较04希尔排序。原创 2022-07-28 22:15:31 · 196 阅读 · 0 评论 -
Java算法笔记03:插入排序
代码】Java算法笔记03插入排序。原创 2022-07-26 18:03:34 · 235 阅读 · 4 评论 -
Java算法笔记02:选择排序
代码】Java算法笔记02选择排序。原创 2022-07-26 18:00:00 · 116 阅读 · 0 评论 -
Java算法笔记01:冒泡排序
代码】Java算法笔记01冒泡排序。原创 2022-07-26 17:51:36 · 166 阅读 · 0 评论