刷题笔记
记录刷题出现的错误,思路,以及好题解析
起个名字好难__
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
刷题笔记:再讲二分查找(以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 · 197 阅读 · 0 评论 -
刷题笔记:快慢指针
快慢指针 相关证明 Th 1.在有环的链表中,快慢指针一定相遇。 证明:如果链表中有环,快慢指针一定在环内相遇。这可以看做是,快指针追赶慢指针的过程。 如果快指针在与慢指针差一步,则在下一步中,快指针前进两步,慢指针前进一步,两个指针相遇。 如果快慢指针相差两步,在下一步中,快指针前进两步,慢指针前进一步,两个指针相差一步,转为第一种情况。 如果快慢指针相差N步,经过N-1步的追逐,转换为第一种情况。 因此在有环的链表中快慢指针必然相遇。 2.Th 2:慢指针进入环之后,快指针最多比慢指针多绕一个圈。 证原创 2021-01-27 12:10:15 · 279 阅读 · 0 评论 -
刷题笔记:排序算法总结(计数、桶排、基数)
计数排序 计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。 算法步骤: 找出待排序的数组中最大和最小的元素; 统计数组中每个值为i的元素出现的次数,存入数组C的第i项; 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加); 反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1。 代码如下: 下述代码事实上还可以进行优化,即新建的tmp的大原创 2021-01-07 12:08:27 · 230 阅读 · 0 评论 -
刷题笔记:排序算法汇总(2)(选择、归并)
归并排序(二路归并) 思想:利用分治的思想,对待排序的数组划分为一个个的子排序任务,然后合并,再进行排序。具体来说就是: 把长度为n的输入序列分成两个长度为n/2的子序列; 对这两个子序列分别采用归并排序; 将两个排序好的子序列合并成一个最终的排序序列。 将上述步骤递归进行,直至最终得到有序序列。 见下图: 代码实现如下: public static int[] sort(int[] nums){ return reSort(nums,0,nums.length-1); }原创 2021-01-06 19:47:13 · 165 阅读 · 0 评论 -
刷题笔记:排序算法汇总(1)(冒泡、快排、插入排序、希尔排序)
排序算法是算法题中非常常见的一类题,相关的排序方法也很多,如:快速排序、冒泡排序、归并排序、简单选择排序、堆排序等等。本文以Leetcode 面试题 17.14. 最小K个数为例,对以上排序算法做一个回顾。 冒泡排序 冒泡排序是一种交换排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 算法步骤: 比较相邻的元素。如果第一个原创 2020-12-27 14:13:59 · 218 阅读 · 0 评论 -
刷题笔记:根据中序遍历与前序遍历确定二叉树&根据后序遍历与前序遍历确定二叉树
根据中序遍历与前序遍历确定二叉树 对于一棵树而言,前序遍历的形式为: [根节点,[左子树的前序遍历],[右子树的前序遍历]]。 中序遍历形式为: [[左子树的中序遍历],根节点,[右子树的中序遍历]] 因此,只要我们定位到根节点在中序遍历中的位置,就可以知道其左边的序列是其左子树的中序遍历,右边的序列是其右子树中序遍历的结果。此外,由于中序与前序遍历,其子树节点的数量是一定的,所以可以进一步确定根节点的左子树与右子树的前序与中序遍历。因此,我们就可以递归的构造左子树与右子树。 代码实现如下: public原创 2020-11-20 22:57:20 · 650 阅读 · 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 · 206 阅读 · 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 · 404 阅读 · 0 评论 -
动态规划示例——以leetcode股票系列问题为例
动态规划是编程题中高频出现,且具有一定难度的算法。对于动态规划的解读参见本篇博客。下面我们以leetcode中的股票问题为例,使用动态规划算法解决问题。 leetcode 122 leetcode121 leetcode 714原创 2020-06-12 16:40:29 · 215 阅读 · 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 · 603 阅读 · 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 · 512 阅读 · 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 · 196 阅读 · 0 评论
分享