![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
刷题
风乎舞雩咏而归
杭州大厂搬砖ing
展开
-
【动态规划】刷题总结
参考文献动态规划之背包问题系列这篇文章写的真滴牛逼,感谢~原创 2021-03-11 21:36:19 · 190 阅读 · 0 评论 -
【前缀和、差分数组】刷题总结
介绍前缀和主要适用的场景是原始数组不会被修改的情况下,频繁查询某个区间的累加和。前缀和,核心代码就是下面这段:class PrefixSum { // 前缀和数组 private int[] prefix; /* 输入一个数组,构造前缀和 */ public PrefixSum(int[] nums) { prefix = new int[nums.length + 1]; // 计算 nums 的累加和 for (in原创 2021-03-09 12:26:16 · 260 阅读 · 0 评论 -
【双指针】刷题总结
介绍双指针技巧再分为两类,一类是「快慢指针」,一类是「左右指针」。前者解决主要解决链表中的问题,比如典型的判定链表中是否包含环;后者主要解决数组(或者字符串)中的问题,比如二分查找。题型快慢指针判定链表中是否含有环已知链表中含有环,返回这个环的起始位置寻找链表的中点寻找链表的倒数第 n 个元素如何去除有序数组的重复元素第五点是单独的一类题型,参看如何去除有序数组的重复元素左右指针二分查找两数之和反转数组滑动窗口算法参考文章双指针技巧...原创 2021-03-08 11:45:46 · 161 阅读 · 0 评论 -
位运算 刷题总结
位运算介绍位运算(&、|、^、~、>>、<<):从现代计算机中所有的数据二进制的形式存储在设备中。即 0、1 两种状态,计算机对二进制数据进行的运算(+、-、*、/)都是叫位运算。用法判断两个数是否异号int x = -1, y = 2;bool f = ((x ^ y) < 0); // trueint x = 3, y = 2;bool f = ((x ^ y) < 0); // false这个技巧还是很实用的,利用的是补码编码的符号位原创 2021-03-07 20:03:38 · 210 阅读 · 0 评论 -
设计数据结构刷题总结
介绍有这么一类题,会考察利用已有的数据结构(包含某些算法)来设计一种新的数据结构。经典例题【力扣-232. 用栈实现队列】/** * 主要难点在于pop时要记得检查s2栈是否为空 */import java.util.Stack;//leetcode submit region begin(Prohibit modification and deletion)class MyQueue { private Stack<Integer> s1; priv原创 2021-03-03 16:20:54 · 243 阅读 · 1 评论 -
单调栈、单调队列刷题总结
单调栈介绍单调栈实际上就是栈,只是利用了一些巧妙的逻辑,使得每次新元素入栈后,栈内的元素都保持有序(单调递增或单调递减)。听起来有点像堆(heap)?不是的,单调栈用途不太广泛,只处理一种典型的问题,叫做 Next Greater Element。代码模板: public int[] nextGreaterElement(int[] nums) { int len = nums.length; int[] res = new int[len]; Sta原创 2021-03-03 12:47:33 · 271 阅读 · 0 评论 -
递归思想刷题总结
核心思想我们在调用递归函数的时候,把递归函数当做普通函数(黑箱)来调用,即明白该函数的输入输出是什么,而不用管此函数内部在做什么。(千万不要跳进去了,你脑袋能压几个栈呀?)例题【力扣-395. 至少有K个重复字符的最长子串】解题思路本题要求的一个最长的子字符串的长度,该子字符串中每个字符出现的次数都最少为 kk。求最长子字符串/区间的这类题一般可以用滑动窗口来做,但是本题滑动窗口的代码不好写,我改用递归。也借本题来帮助大家理解递归。重点:我们在调用递归函数的时候,把递归函数当做普通函数(黑原创 2021-02-27 13:55:39 · 227 阅读 · 0 评论 -
[算法] 九、动态规划
说明总结:动态规划,一般来说,首先弄明白暴力递归怎么做(尝试),然后再优化(避免重复计算),把暴力递归的过程抽象成状态表达。经典例题汉诺塔/** * * 汉诺塔问题 * 打印n层汉诺塔从最左边移动到最右边的全部过程 * */public class Code_02_Hanoi { public static void hanoi(int n) { if (n > 0) { func(n, n, "left", "mid", "right"); } }原创 2021-02-21 17:07:22 · 90 阅读 · 0 评论 -
[算法] 八、贪心算法
经典例题金条切割/** * 金条切割 * 一块金条切成两半,是需要花费和长度数值一样的铜板的。比如 * 长度为20的 金条,不管切成长度多大的两半,都要花费20个铜 * 板。一群人想整分整块金 条,怎么分最省铜板? * 例如,给定数组{10,20,30},代表一共三个人,整块金条长度为 * 10+20+30=60. 金条要分成10,20,30三个部分。 如果, 先把长 * 度60的金条分成10和50,花费60 再把长度50的金条分成20和30, * 花费50 一共花费110铜板。原创 2021-02-21 13:53:00 · 121 阅读 · 0 评论 -
滑动窗口刷题总结
代码模板《挑战程序设计竞赛》这本书中把滑动窗口叫做「虫取法」,我觉得非常生动形象。因为滑动窗口的两个指针移动的过程和虫子爬动的过程非常像:前脚不动,把后脚移动过来;后脚不动,把前脚向前移动。我分享一个滑动窗口的模板,能解决大多数的滑动窗口问题def findSubArray(nums): N = len(nums) # 数组/字符串长度 left, right = 0, 0 # 双指针,表示当前遍历的区间[left, right],闭区间 sums = 0 # 用于统计 子数组原创 2021-02-21 11:06:16 · 172 阅读 · 0 评论 -
[算法] 七、并查集
例题岛问题package class_05;/** * * 岛问题 * * 一个矩阵中只有0和1两种值,每个位置都可以和自己的上、下、左、右 * 四个位置相连,如果有一片1连在一起,这个部分叫做一个岛,求一个 * 矩阵中有多少个岛? * 举例: 0 0 1 0 1 0 1 1 1 0 1 0 1 0 0 1 0 0 0 0 0 0 0 0 这个矩阵中有三个岛。 * */public class Code_03_Islands { public static i原创 2021-02-20 15:10:30 · 116 阅读 · 0 评论 -
哈希表刷题总结
典型例题力扣–697参考题解: class Solution { public int findShortestSubArray(int[] nums) { //定义一个Map,Key为数组中的值,Value为一个数组,数组的第一个元素为Key出现的次数,第二个元素为Key第一次出现的位置,第三个元素为Key最后一次出现的位置。 Map<Integer,int[]> map = new HashMap<Integer,int[]>()原创 2021-02-20 11:57:27 · 238 阅读 · 2 评论 -
[算法] 六、 二叉树
二叉树二叉树的先序、中序、后续遍历,包括递归和非递归方式import java.util.Stack;/** * * 实现二叉树的先序、中序、后序遍历,包括递归方式和非递归方式 * */public class Code_01_PreInPosTraversal { public static class Node { public int value; public Node left; public Node right; public Node(int da原创 2021-02-18 15:57:01 · 211 阅读 · 2 评论 -
[算法] 五、链表
例题【题目】 一种特殊的链表节点类描述如下:public class Node { public int value; public Node next; public Node rand; public Node(int data) { this.value = data; }}Node类中的value是节点值,next指针和正常单链表中next指针的意义一 样,都指向下一个节点,rand指针是Node类中新增的指针,这个指针可 能指向链表中的任意一个节点,也可能指向n原创 2021-02-17 16:51:39 · 103 阅读 · 0 评论 -
[算法] 四、桶排序、计数排序、基数排序以及部分例题
左神算法基础班第三讲桶排序、计数排序、基数排序非基于比较的排序,与被排序的样本的实际数据状况很有关系,所以实际中并不经常使用时间复杂度O(N)O(N)O(N),额外空间O(N)O(N)O(N)稳定的排序桶排序是一个大的概念,针对具体的实现可分为计数排序、基数排序例题给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要求不能用非基于比较的排序。 public static int maxGap(int[] nums) { if (nums == n.原创 2021-02-05 23:08:09 · 248 阅读 · 2 评论 -
[算法] 三、排序--排序算法的补充
工程中的综合排序算法对于基本数据类型(int,float等),用快排。因为快排的速度最快对于自己定义的类型(class类),用归并排序。因为归并排序是稳定的。当样本量小于60时,用插入排序。尽管插入排序的复杂度是O(N2)O(N^{2})O(N2),但是当样本量很小的时候,由于插入排序的常数项很小,所以很快注:对于大规模的样本量排序,根据数据类型选择快排还是归并排序,然后对分割后的小样本量插入排序有关排序问题的补充归并排序的额外空间复杂度可以变成O(1)O(1原创 2021-02-05 21:33:48 · 125 阅读 · 0 评论 -
[算法] 二、排序--归并、快速、堆
代码实现MergeSortpackage Train_01;public class MergeSort { public static void main(String[] args) { int[] arr = new int[]{3, 2, 14, 4, 5, 1, 8, -4, 0, 4, -2, -9}; mergeSort(arr); printArray(arr); } pub原创 2021-02-05 17:54:41 · 131 阅读 · 5 评论 -
[算法] 一、排序--冒泡、选择、插入
代码实现BubbleSortpackage Train_01;/** * @author Bluth */public class BubbleSort { public static void main(String[] args) { int[] arr = new int[]{3, 2, 14, 4, 5, 1, 8, -4, 0, 4, -2, -9}; bubblesort(arr); pr原创 2021-02-05 17:32:17 · 69 阅读 · 0 评论 -
并查集 刷题总结
并查集模板class UF { // 连通分量个数 private int count; // 存储一棵树 private int[] parent; // 记录树的“重量” private int[] size; public UF(int n) { this.count = n; parent = new int[n]; size = new int[n]; for (int i原创 2021-02-03 09:40:16 · 128 阅读 · 0 评论 -
leetcode习题整理
从2021/1/15起并查集T947原创 2021-01-16 10:24:01 · 69 阅读 · 0 评论 -
Leetcode 删除或保留若干字符字典序问题
我花了几天时间,从力扣中精选了四道相同思想的题目,来帮助大家解套,如果觉得文章对你有用,记得点赞分享,让我看到你的认可,有动力继续做下去。这就是接下来要给大家讲的四个题,其中 1081 和 316 题只是换了说法而已。316. 去除重复字母(困难)321. 拼接最大数(困难)402. 移掉 K 位数字(中等)1081. 不同字符的最小子序列(中等)402. 移掉 K 位数字(中等)我们从一个简单的问题入手,识别一下这种题的基本形式和套路,为之后的三道题打基础。题目描述给定一个以字符串表转载 2020-12-20 21:45:58 · 797 阅读 · 0 评论