其他系列文章导航Java基础合集数据结构与算法合集设计模式合集多线程合集分布式合集ES合集文章目录其他系列文章导航文章目录前言一、题目描述二、题解2.1 方法一:分离节点后合并三、代码3.1 方法一:分离节点后合并四、复杂度分析4.1 方法一:分离节点后合并前言这是力扣的328题,难度为中等,解题方案有很多种,本文讲解我认为最奇妙的一种。慢慢开始链表的模块了,这道题是一道非常好的队列的例题,很有代表性。一、题目描述给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类
什么是滑动窗口思想:滑动窗口是一种算法技巧,用于解决一类涉及子串/子数组的问题。滑动窗口可以通过定义两个指针(通常是左右指针或起始和结束指针),来构建一个可变大小的窗口,从而在给定的数据结构(如字符串或数组)上移动窗口,并实时更新窗口内的状态。滑动窗口算法的基本思想是:初始化窗口的左右边界,使窗口包含初始的元素或子串。不断移动右边界,扩大窗口,同时根据问题要求进行相应的操作(如计算最小值、最大值、求和等)。如果窗口内的状态满足某个条件,尝试缩小窗口,即移动左边界,继续进行步骤2。重复步骤2和3,直到右边界到达数据结构的末尾。滑动窗口主要分为两大类,一种是长度固定的滑动窗口,一种是长度动态变化的
📚博客主页:爱敲代码的小杨.✨专栏:《JavaSE语法》❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️🙏小杨水平有限,欢迎各位大佬指点,相互学习进步!文章目录1.题目描述示例1:示例2:提示2.思路3.代码1.题目描述给你两个单链表的头节点headA和headB,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回null。图示两个链表在节点c1开始相交:题目数据保证整个链式结构中不存在环。注意,函数返回结果后,链表必须保持其原始结构。自定义评测:评测系统的输入如下(你设计的程序不适用此输入):intersectVal-相交的起始节点的值。如果不存在相
目录顺序表顺序表的优点顺序表的实现1.结构体的定义2.初始化数组 3.插入数据4.其余接口函数的实现5.释放内存顺序表的缺陷单向链表单向链表的优点单向链表的实现1.链表的定义 2.链表的初始化3.其余接口函数的实现5.释放内存单向链表的缺陷双向链表双向链表的优点双向链表的实现1.双向链表的初始化2.链表的初始化3.其余接口函数的实现 4.释放内存 双向链表的缺陷总结线性表(linearlist)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...线性表和链表的物理结构:线性表在逻辑上是线性结构,也就说是连续的一条直线
1矩阵置零给定一个 mxn 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。示例1:输入:matrix=[[1,1,1],[1,0,1],[1,1,1]]输出:[[1,0,1],[0,0,0],[1,0,1]]方法一:使用标记数组新建两个标记数组rowcolumn第一次遍历数组记录数组中每一行每一列中的值是否为0第二次遍历数组将数组中0所在的行和列设置为0classSolution{publicvoidsetZeroes(int[][]matrix){intm=matrix.length;intn=matrix[0].length;//新建两个数组记录
字符串压缩字符串压缩思路一(双指针顺畅版)思路二(sprintf函数巧解版)Thanks♪(・ω・)ノ谢谢阅读下一篇文章见!!!字符串压缩来看题目:根据题目所说,我们需要完成函数书写,保证返回一个相对较小的字符数组:如果压缩后比原字符串小,则返回压缩字符串,否则返回原字符串。思路一(双指针顺畅版)本思路一步一步操作,逐步完成任务先确认字符串长度是否小于2,小于直接返回(因为压缩字符串长度至少是2)然后定义双指针和计数位开始遍历:*fast与*slow不相等则fast向后移动然后记录重复次数重复次数分位数进入数组slow到fast位置,计数归零重复3-6直到遍历结束char*compressSt
1.代码随想录-动规8.LC343整数拆分题目链接dp数组含义:dp[i]表示拆分i的最大乘积递推公式:dp[i]=max(j*(i-j),j*dp[i-j],dp[i])解释:从1遍历j,有两种渠道得到dp[i].一个是j*(i-j)直接相乘。一个是j*dp[i-j],相当于是拆分(i-j)为何不拆分j:j是从1开始遍历,拆分j的情况,在遍历j的过程中其实都计算过了比如:dp[7]拆分3和dp[4],为什么不拆分3?因为dp[7]拆成1和dp[6]的时候就已经拆3了(1+2+4)初始化:dp[0]=0;dp[1]=0;dp[2]=1;遍历终止条件:拆分一个数n使之乘积最大,那么一定是拆分成m
作者推荐【动态规划】【数学】【C++算法】18赛车涉及知识点动态规划二分查找LeetCode730.统计不同回文子序列给你一个字符串s,返回s中不同的非空回文子序列个数。由于答案可能很大,请返回对109+7取余的结果。字符串的子序列可以经由字符串删除0个或多个字符获得。如果一个序列与它反转后的序列一致,那么它是回文序列。如果存在某个i,满足ai!=bi,则两个序列a1,a2,…和b1,b2,…不同。示例1:输入:s=‘bccb’输出:6解释:6个不同的非空回文子字符序列分别为:‘b’,‘c’,‘bb’,‘cc’,‘bcb’,‘bccb’。注意:‘bcb’虽然出现两次但仅计数一次。示例2:输入:
一、题目给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1,-1]。你必须设计并实现时间复杂度为 O(logn) 的算法解决此问题。示例1:输入:nums=[5,7,7,8,8,10],target=8输出:[3,4]示例 2:输入:nums=[5,7,7,8,8,10],target=6输出:[-1,-1]示例3:输入:nums=[],target=0输出:[-1,-1]二、思路解析二分查找,它很简单,但也很容易写出死循环。不过,不必过多恐惧,只要多做练习,他就会是最简
【岛屿数量】给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。思路:很经典也很基础的图搜题,bfs或者dfs都行,这题先用dfs写一下。每次开启函数(而不是被递归调用),会将当前起点能接触到的所有陆地都访问一次再退出,记录函数开启的次数即可。对每个格子,我们向上下左右四个方向拓展,对其中位置合法的、是陆地的、还没被访问过的格子进行递归调用,直到所有能访问的格子都访问完毕。代码其实跟树的dfs也大同小异,区别只在出口的判断条件,以及可能递归