刷题笔记
记录刷题出现的错误,思路,以及好题解析
起个名字好难__
这个作者很懒,什么都没留下…
展开
-
刷题笔记:再讲二分查找(以leetcode剑指offer53-I为例)
在这篇博客中,我们以leetcode162题为例对二分查找中的易错点进行了辨析,但是在这篇博客中,关于左右边界的查找写的并不好。下面对左右边界的查找的代码进行简化。左边界查找在上篇博客中,这块关于左边界查找的通用模板是以[0,nums.length)为范围进行查找的。这篇博客中关于查找范围的讲解时非常棒的。下面对于其中模板的改进也是基于这个理论的: int len=nums.length; int mid=0; int left=0,right=len-1原创 2021-03-27 16:52:03 · 133 阅读 · 0 评论 -
刷题笔记:快慢指针
快慢指针相关证明Th 1.在有环的链表中,快慢指针一定相遇。证明:如果链表中有环,快慢指针一定在环内相遇。这可以看做是,快指针追赶慢指针的过程。如果快指针在与慢指针差一步,则在下一步中,快指针前进两步,慢指针前进一步,两个指针相遇。如果快慢指针相差两步,在下一步中,快指针前进两步,慢指针前进一步,两个指针相差一步,转为第一种情况。如果快慢指针相差N步,经过N-1步的追逐,转换为第一种情况。因此在有环的链表中快慢指针必然相遇。2.Th 2:慢指针进入环之后,快指针最多比慢指针多绕一个圈。证原创 2021-01-27 12:10:15 · 182 阅读 · 0 评论 -
刷题笔记:排序算法总结(计数、桶排、基数)
计数排序计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。算法步骤:找出待排序的数组中最大和最小的元素;统计数组中每个值为i的元素出现的次数,存入数组C的第i项;对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加);反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1。代码如下:下述代码事实上还可以进行优化,即新建的tmp的大原创 2021-01-07 12:08:27 · 148 阅读 · 0 评论 -
刷题笔记:排序算法汇总(2)(选择、归并)
归并排序(二路归并)思想:利用分治的思想,对待排序的数组划分为一个个的子排序任务,然后合并,再进行排序。具体来说就是:把长度为n的输入序列分成两个长度为n/2的子序列;对这两个子序列分别采用归并排序;将两个排序好的子序列合并成一个最终的排序序列。将上述步骤递归进行,直至最终得到有序序列。见下图:代码实现如下: public static int[] sort(int[] nums){ return reSort(nums,0,nums.length-1); }原创 2021-01-06 19:47:13 · 86 阅读 · 0 评论 -
刷题笔记:排序算法汇总(1)(冒泡、快排、插入排序、希尔排序)
排序算法是算法题中非常常见的一类题,相关的排序方法也很多,如:快速排序、冒泡排序、归并排序、简单选择排序、堆排序等等。本文以Leetcode 面试题 17.14. 最小K个数为例,对以上排序算法做一个回顾。冒泡排序冒泡排序是一种交换排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。算法步骤:比较相邻的元素。如果第一个原创 2020-12-27 14:13:59 · 145 阅读 · 0 评论 -
刷题笔记:根据中序遍历与前序遍历确定二叉树&根据后序遍历与前序遍历确定二叉树
根据中序遍历与前序遍历确定二叉树对于一棵树而言,前序遍历的形式为:[根节点,[左子树的前序遍历],[右子树的前序遍历]]。中序遍历形式为:[[左子树的中序遍历],根节点,[右子树的中序遍历]]因此,只要我们定位到根节点在中序遍历中的位置,就可以知道其左边的序列是其左子树的中序遍历,右边的序列是其右子树中序遍历的结果。此外,由于中序与前序遍历,其子树节点的数量是一定的,所以可以进一步确定根节点的左子树与右子树的前序与中序遍历。因此,我们就可以递归的构造左子树与右子树。代码实现如下:public原创 2020-11-20 22:57:20 · 539 阅读 · 0 评论 -
Java:深度优先搜索、广度优先搜索
以下图的遍历为例广度优先搜索英文缩写为BFS即Breadth FirstSearch。其过程检验来说是对每一层节点依次访问,访问完一层进入下一层,而且每个节点只能访问一次。在实际实现中,使用队列来进行实现,先往队列中插入左节点再插入右节点,这样出队就是先左后右了。先将A插入队列中,队列中有元素(A)将A弹出,得到A结点,然后A的孩子从左至右先后放到队列中,(B,C)。继续弹出B,得到B结点,然后将B的孩子从左至右先后放入到队列中,(C,D,E)。然后弹出C,将C的左右孩子依次放入(D,E,F原创 2020-11-14 18:31:30 · 130 阅读 · 0 评论 -
刷题笔记:树的前序、中序、后序遍历
在此之前,我们定义二叉树的数据结构如下:class TreeNode//节点结构{ int value; List<TreeNode> children=new ArrayList<>(); TreeNode left; TreeNode right; TreeNode(int value) { this.value = value; }}//主函数public class main { public static List<In原创 2020-10-31 17:17:13 · 270 阅读 · 0 评论 -
动态规划示例——以leetcode股票系列问题为例
动态规划是编程题中高频出现,且具有一定难度的算法。对于动态规划的解读参见本篇博客。下面我们以leetcode中的股票问题为例,使用动态规划算法解决问题。leetcode 122leetcode121leetcode 714原创 2020-06-12 16:40:29 · 150 阅读 · 0 评论 -
详解动态规划——从暴力递归到动态规划
以下内容参照了https://zhuanlan.zhihu.com/p/78220312。动态规划遵循一套固定的流程:递归的暴力解法 -> 带备忘录的递归解法 -> 非递归的动态规划解法下面以斐波那契数列为例,揭开动态规划的面纱:斐波那契数列一、暴力递归法int fib(int N) { if (N == 1 || N == 2) return 1; return fib(N - 1) + fib(N - 2);}但是使用递归算法求解该问题往往是十分低效的,不仅原创 2020-06-11 22:43:26 · 461 阅读 · 0 评论 -
二分法易错点分析,结合leetcode162题
二分法解析二分法是一个看似简单实则细节中暗藏魔鬼的方法。避免二分法出错的关键是,把握住搜索区间一、基本的二分法常规的二分法套路如下:int binarySearch(int[] nums, int target) { int left = 0; int right = nums.length - 1; // 注意 ① while(left <= right) { // 注意 ② int mid = (right + left)原创 2020-06-09 11:59:57 · 406 阅读 · 0 评论 -
leetcode数组:面试题 01.07. 旋转矩阵
出现问题,矩阵转置失效,代码如下:for(int i=0;i<len-1;i++){ for(int j=0;j<len;j++){ if(i!=j){ temp=matrix[i][j]; matrix[i][j]=matrix[j][i]; matrix[j][i]=temp; }原创 2020-05-24 11:03:59 · 137 阅读 · 0 评论