常用算法思想和刷题方法
文章平均质量分 75
常见算法思想: 暴力, 分治, 贪心, 动态规划等
刷题方法: 双指针, 尾递归等
菜菜的大数据开发之路
Java技术栈 AND 大数据开发,学习笔记, 拒绝水文
展开
-
tag排序-刷题预备知识-2. TopK 解法总结, Java实现 dbc
摘自看过的一篇深度好文, 强推!原创 2022-10-09 16:23:24 · 365 阅读 · 0 评论 -
tag数组-刷题预备知识-6. 数组的前缀和(preSum), lt.303 + lt.304 1.2
前缀和前缀和一般用来用作区间求和, 它的每个值都是从**左边最初始位置的数(如下标0)**到它本身的和前缀和的主要使用场景: 原始数组不会被修改的情况下, 频繁查询某个区间的累加和, 原始数组不改变是相对于差分法来讲的.一维数组的前缀和其实可以把它理解为数学上的数列的前n项和(对于一个一维数组的前缀和)。我们定义对于一个数组a的前缀和数组s,s[i] = a[1]+a[2]+…+a[i].比如数组[1,3,5,7]的前缀和为[1,4,6,8], 借助前缀数组, 我们可以求出某一段区间原创 2022-03-28 12:25:49 · 1121 阅读 · 0 评论 -
tag排序-刷题预备知识-1.《快排, 堆排, 归并》最常见写法和优化,Java实现 2
文章目录一, 快排1.0 快排基本写法-挖坑法1.1 快排基本写法-左右双指针(left, right)1.2, 快排的时空复杂度分析A, 快排优化一, 随机基准值快排B, 快排优化三, 三数取中1.3, 快排为什么越趋近于有序就越慢1.4 非递归快排1.5 链表快排二, 堆排序三, 归并排序3.1 迭代法的归并排序(学有余力再来补充)3.2 归并排序单链表本文主要是对力扣中最常遇到的三大排序和各种考察角度进行了一个大致总结, 主要是因为笔者发现网上大多数帖子的有些排序都不是最优的写法, 在力扣中都需要原创 2022-03-24 10:17:45 · 767 阅读 · 0 评论 -
tag二叉树-刷题预备知识-1. 深入浅出深度优先遍历(DFS)和广度优先遍历(BFS) + lt. 102. 二叉树的层序遍历 1
零, BFS, DFS 基本知识扫盲Java实现图的深度优先遍历(DFS)和广度优先遍历(BFS)一, BFS和DFS的比较DFS(深度优先搜索)和 BFS(广度优先搜索)就像孪生兄弟,提到一个总是想起另一个。然而在实际使用中,我们用 DFS 的时候远远多于 BFS。那么,是不是 BFS 就没有什么用呢?如果我们使用 DFS/BFS 只是为了遍历一棵树、一张图上的所有结点的话,那么 DFS 和 BFS 的能力没什么差别,我们当然更倾向于更方便写、空间复杂度更低的 DFS 遍历。不过,某些使用场景是转载 2022-03-21 13:45:11 · 697 阅读 · 0 评论 -
tag队列和栈-刷题预备知识-1. 必备知识点和常规题 2.5
一, 队列队列: 先进先出, 尾部插入, 头部取出; 新元素始终保持在队尾.二, 栈栈: 先进后出(后进先出), 栈顶放入或取出元素; 最后一个元素首先受到处理;适合场景: 当你想首先处理最后一个元素时,栈将是最合适的数据结构三, 数组模拟实现栈, 普通队列, 循环队列我们将集中总结一下, 三者之间在初值, 判空, 判满, 取出元素, 放入元素, 有效元素个数(循环队列)上的差异;详细文章请查看Java实现栈以及栈的一些应用Java 数组模拟实现普通队列,循环队列原创 2022-03-03 11:25:08 · 865 阅读 · 0 评论 -
tag数组-刷题预备知识-5. 数组中的滑动窗口 1.5
一, 概述简而言之,滑动窗口算法在一个特定大小的字符串或数组上进行操作,而不在整个字符串和数组上操作,这样就降低了问题的复杂度,从而也达到降低了循环的嵌套深度。其实这里就可以看出来滑动窗口主要应用在数组和字符串上, 当你遇到让求子串,子数组的问题时就要考虑一下使用双指针滑动窗口了.二, 原理之后重复上述过程,先移动 right,再移动 left…… 直到 right 指针到达字符串 S 的末端,算法结束。如果你能够理解上述过程,恭喜,你已经完全掌握了滑动窗口算法思想。至于如何具体到问题,如何原创 2021-11-23 15:01:53 · 539 阅读 · 0 评论 -
tag数组-刷题预备知识-4.一通百通解决二分查找问题
文章目录1. 二分法查找法的基本思想2. 二分查找的时间复杂度3. 二分查找的几个模版3.1 模板一: 标准的二分查找3.2 模板二: 二分查找边界(左边界, 右边界, 或是左右边界)3.2 模板三: 二分查找极值点4. 总结1. 二分法查找法的基本思想二分法其实就是使用了分治法的思想;二分法的基本思想是将n个元素分成大致相等的两部分, 取nums[mid] 与 target 做比较:如果 target = nums[mid], 则找到target, 运行结束, 返回mid;如果 target原创 2021-11-18 11:50:55 · 568 阅读 · 0 评论 -
tag数组-刷题预备知识-3.数组中的 双指针 ,快慢指针,滑动窗口 (待补充,扩展)
一, 概述双指针主要是用于遍历数组, 两个指针指向不同的元素,从而协同完成任务.当然, 我们也可以延伸到多个数组的多个指针[用法和应用场景]一, 左右指针(相向双指针)[定义]1.1 lt1. 两数之和1.2 lt167. 两数之和IIlt 二分查找法删除有序数组中的重复项 ||lt 283 移动零lt 633. 平方数之和剑指Offer. 奇偶数排序二, 快慢指针(同向双指针)1.3 lt26. 删除有序数组中的重复项三, 滑动窗口(同向双指针)详细文章原创 2021-11-09 15:20:44 · 365 阅读 · 0 评论 -
tag数组-刷题预备知识-2. Java中数组和集合的各种排序方法 2.8
Collections.sort(集合工具类, 适合于自然排序)自然排序法, 实现Comparable接口, 实现其中的comapreTo(Obj obj)方法比较器, 实例化Comparator类, 重写其中的compre(Obajec obj1, Object obj2)参考资料:2.2 节, 集合排序的两种方法ArrayList集合排序方式总结List集合排序 sort方法...原创 2021-11-07 11:47:34 · 383 阅读 · 2 评论 -
tag数组-刷题预备知识-1. 集合和数组之间的转换(重要) 2.8
我们在手撕力扣的时候, 经常能遇到这样类型的题目: 要求你返回一个长度未知的数组或是需要暂时存储一个长度不定的数, 这个时候, 可能大多数想到的就是前期先把需要的数组或者字符串放到集合中, 根据题目需要选择是ArrayList亦或是k-v对的HashMap, 在返回的时候, 把集合转换为数组返回即可那么, 在遇到上述这种问题时, 我们就不可避免的要用到数组<---->集合之间的相互转换.一, 集合转为数组 (集合对象.toArray() / 集合对象.toArray( T[] a)).原创 2021-11-06 12:10:21 · 390 阅读 · 1 评论 -
tag数组-刷题预备知识-0.1 一维数组 + lt.724 寻找数组的中心下标 + lt.35 搜索插入位置 1
数组的随机访问方法1.1 Leetcode 724 寻找数组的中心下标(easy)[案例需求]给你一个整数数组 nums,请编写一个能够返回数组 “中心下标” 的方法。数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。如果数组不存在中心下标,返回 -1 。如果数组有多个中心下标,应该返回最靠近左边的那一个。注意:中心下标可能出现在数组的两端。示例 1:输入:nums = [1, 7, 3, 6, 5, 6]输出:3解释:中心下标是 3 。左侧数之.原创 2021-05-22 22:26:10 · 270 阅读 · 4 评论 -
tag数组-刷题预备知识-0.5 二维数组概述 + lt.48旋转图像 + 多角度旋转通用方法 1 (待补充)
文章目录二, 二维数组2.1. 二维数组简介2.2. LeetCode 48. 旋转图像(Medium)二, 二维数组2.1. 二维数组简介二维数组是一种结构较为特殊的数组,只是将数组中的每个元素变成了一维数组所以二维数组的本质上仍然是一个一维数组,内部的一维数组仍然从索引 0 开始,我们可以将它看作一个矩阵,并处理矩阵的相关问题。示例如下:类似一维数组,对于一个二维数组 A = [[1, 2, 3, 4],[2, 4, 5, 6],[1, 4, 6, 8]] ,计算机同样会在内存中申请一原创 2021-05-26 14:36:51 · 475 阅读 · 1 评论 -
一, 基于Java 的分治算法和典型实现栗子(仔细看, 能行)
一, 分治算法概述1.1 分治法的思想和特点分治算法是采用了分治思想的一种算法, 什么是分治呢?分值策略: 分治, 字面上的解释就是"分而治之",将原问题划分为n个规模较小而结构与原问题相似的子问题; 递归的解决这些子问题, 然后再合并其结果, 就得到原问题的解;将父问题分解为子问题的同等方式求解, 这和递归的概念很吻合, 所以在分治算法通常以递归的方式实现(当然也是有非递归的实现方式). 分治算法的描述从字面上也很容易理解, 分, 治, 其实还有个合并的过程:- 分解(Divide): 将原创 2021-06-04 12:50:15 · 298 阅读 · 3 评论