算法题
文章平均质量分 75
主要为leetcode刷题笔记
Javan Lu
这个作者很懒,什么都没留下…
展开
-
91刷题记录
91天刷算法Day1 -989. 数组形式的整数加法思路Day2- 821. 字符的最短距离思路1思路2Day3 -1381. 设计一个支持增量操作的栈思路Day4 - 394. 字符串解码思路Day5 - 232.用栈实现队列思路Day6 - 768.最多能完成排序的块②思路Day7 - 61.旋转链表思路Day8 - 24.两两交换链表中的节点思路Day9 - 109.有序链表转换二叉搜索树思路代码优化Day10 - 160.相交链表思路Day11 - 142.环形链表②思路Day12 - 146.LR原创 2021-08-31 20:43:37 · 370 阅读 · 0 评论 -
二维数组按照特定规则排序
一般而言,二维数组定制规则需要进行重写比较器,但是那个比较器在java中记忆复杂,所有我们一般使用,lambada表达式进行。5.表示第0列从小到大,若是遇到第0列值相等的,按照第1列从大到小排序。1.表示第0列按照从小到大排序。2.表示第1列按照从小到大排序。3.表示第0列按照从大到小排序。4.表示第1列按照从大到小排序。原创 2022-09-18 09:36:24 · 584 阅读 · 0 评论 -
dp和回溯
参考:https://labuladong.gitee.io/algo/1/4/回溯:总结几个核心:针对子集组合问题(组合就是子集的条件中变化,相当于子集的子集):可重复选 就用i 不可重复选就用i+1针对排列问题:不可以构造下标index!!!针对元素重复问题:元素重复的话一定要使用排序,visited数组,然后剪枝if(visited[i]) continue;,特殊情况下还要多一个保证相同元素之间次序保持不变的操作i > 0 && nums[i] == num原创 2022-03-25 12:53:44 · 820 阅读 · 0 评论 -
动态规划刷题总结
动态规划509. 斐波那契数70. 爬楼梯746. 使用最小花费爬楼梯首先要理解什么是动态规划?和贪心的区别是什么?所谓的动态规划中的每一个状态是由上一个状态推导出来的,贪心是没有状态推导,而是从局部直接选出最优。在动态规划中涉及到最优子结构、重叠问题(相比较递归而言,使用一个dp数据记录了前面已经计算过的值)509. 斐波那契数本题很经典的就是使用递归解法,递归出口和处理函数题目也给出来了。class Solution { public int fib(int n) {原创 2021-12-13 10:34:40 · 726 阅读 · 0 评论 -
贪心算法总结
贪心算法455. 分发饼干1005. K 次取反后最大化的数组和860. 柠檬水找零376. 摆动序列55. 跳跃游戏根据卡尔的说法,贪心算法没有所谓的套路框架,只有常识。一般来说,贪心算法只要能把测试案例跑通就可以,不需要去证明,贪心不可以,那么就是可以切换到使用动态规划了。455. 分发饼干这是一个简单的贪心思想题目,每次满足胃口值最小的孩子,于此同时,我还是运用了双指针的思想。class Solution { public int findContentChildren(int[] g原创 2021-12-08 11:27:40 · 114 阅读 · 0 评论 -
回溯算法总结
回溯法17. 电话号码的字母组合22. 括号生成当遇到组合问题的时候,要想到回溯法。17. 电话号码的字母组合class Solution { List<String> res = new ArrayList<>(); // 储存隐射关系:这里要用Character Map<Character,String> map = new HashMap<>(); public List<String> letterCo原创 2021-12-05 10:46:11 · 1482 阅读 · 0 评论 -
DFS和BFS专题
DFS和BFS专题130. 被围绕的区域130. 被围绕的区域总的思想是寻找边界条件,使用标记数组。class Solution { // 将需要的变量设置为全局变量 char[][] board; int rows; int cols; boolean[][] visited; public void solve(char[][] board) { /** 分析: 题目中提示的很明显要处理边界条件。原创 2021-11-30 10:49:43 · 320 阅读 · 0 评论 -
二叉树专题总结
二叉树的总结94. 二叉树的中序遍历(递归+迭代)100. 相同的树(递归出口的思考)101. 对称二叉树(改造dfs)102. 二叉树的层序遍历(层序遍历模板)103. 二叉树的锯齿形层序遍历(加了一个标签的层序遍历)107. 二叉树的层序遍历 II(使用api)104. 二叉树的最大深度(递归)110. 平衡二叉树(计算树高)111. 二叉树的最小深度(计算树高)基本知识:二叉树是一种天然的递归数据结构,这个章节一定要掌握递归的写法,但是面试经常反套路,喜欢问迭代的写法(就是就是将递归的过程用栈模拟出原创 2021-11-16 10:27:08 · 911 阅读 · 0 评论 -
堆和优先队列
堆和优先队列总结215. 数组中的第K个最大元素(优先队列)347. 前 K 个高频元素(哈希表+优先队列)703. 数据流中的第 K 大元素(小顶堆+维护k个容量=堆顶是第k大值)973. 最接近原点的 K 个点(大顶堆+维护k个容量=超过k则移除堆顶,余下就是k个最小值)1046. 最后一块石头的重量(大顶堆)首先要了解什么是堆,大顶堆,小顶堆,优先队列的概念。https://www.cnblogs.com/lanhaicode/p/10546257.htmlJava中的优先队列默认是小顶堆形式原创 2021-11-10 16:19:53 · 525 阅读 · 0 评论 -
栈和队列总结
栈和队列20. 有效的括号(栈的简单应用)20. 有效的括号(栈的简单应用)class Solution { public boolean isValid(String s) { /** 分析: 括号匹配问题是栈的知识 */ // 若是奇数,则必然不会匹配 if(s.length() % 2 == 1){ return false; }原创 2021-11-08 15:57:56 · 184 阅读 · 0 评论 -
排序算法总结
排序法总结50. Pow(x, n)(快速幂)50. Pow(x, n)(快速幂)注意:以下算法为暴力法,时间复杂度为O(n),最后结果是超时了,那么想想能不能降低以下时间复杂度。class Solution { public double myPow(double x, int n) { /** 分析: 题目要求实现pow函数,最直接的思路就是暴力遍历。结果是时间复杂度超时。 */ // return Math原创 2021-11-01 10:25:46 · 389 阅读 · 0 评论 -
位运算总结
位运算刷题总结29. 两数相除(数学知识+位运算知识)29. 两数相除(数学知识+位运算知识)注意:下面的解法,时间超时了!!!因为,如果被除数是最大值,除数是1,那么循环了O(n),最大值的时间复杂度达到了10^10,超过10 ^8 ,O(n)算法大概率超时。而且下面的算法还使用了longclass Solution { public int divide(int dividend, int divisor) { /** 分析: 题目中要求很明原创 2021-10-26 10:44:51 · 319 阅读 · 0 评论 -
数学问题归纳
常见数学问题2. 两数相加(加法模板 + 链表操作)2. 两数相加(加法模板 + 链表操作)/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode n原创 2021-10-23 10:44:48 · 129 阅读 · 0 评论 -
字符串总结
字符串总结28. 实现 strStr()38. 外观数列(模拟进行循环,变态的过程)28. 实现 strStr()class Solution { public int strStr(String haystack, String needle) { /** 分析: 我的第一想法就是使用滑动窗口解题,事实上确实可以使用滑动窗口。 但是对于字符串匹配问题,一般的思路就是暴力解法和kmp算法 */ /原创 2021-10-19 21:18:22 · 134 阅读 · 0 评论 -
数组类总结
数组类型总结135. 分发糖果135. 分发糖果注意:本题的核心就是拆解为子问题,然后使用数组的正向遍历和反向遍历特性,进行迭代求解最优解。class Solution { public int candy(int[] ratings) { /** 分析: 每个孩子至少分配1个糖果==》定义一个数组,数组初始化全为1 若i的分数比左右高,i处的孩子比i-1和i+1的糖果数要多。==》分治成左右两个规则,数组的正向反向遍历,最后取最原创 2021-10-10 11:21:22 · 175 阅读 · 0 评论 -
哈希表总结
哈希表刷题总结1002. 查找共用字符(计数法,数组优化哈希)1370. 上升下降字符串(计数法,数组优化哈希)1002. 查找共用字符(计数法,数组优化哈希)class Solution { public List<String> commonChars(String[] words) { /** 分析: 一般来说使用哈希表用来表示 字符-数量关系,但是本题的字符是26个字母,完全可以使用数组来替代哈希表 这种类型的题原创 2021-10-09 10:14:38 · 190 阅读 · 0 评论 -
链表类(Linked List)
链表类总结206. 反转链表链表如何实现,如何遍历链表。链表可以保证头部尾部插入删除操作都是O(1),查找任意元素位置O(N),快慢指针和链表反转几乎是所有链表类问题的基础,尤其是反转链表,代码很短,建议直接背熟。206. 反转链表注:本题对递归又有了新的认知,前面学习递归的思想,更多的是不要用人脑去计算递归过程,而是用一种通用的办法直接得出答案,这种通用的过程称之为递推公式,后续部分已经完成了,只要关注第k个和第k+1个的逻辑即可!那么本题新的认知是,递归是由递和归组成,递的过程反映的思想就是拆解原创 2021-10-02 22:19:56 · 697 阅读 · 0 评论 -
双指针总结
双指针总结532. 数组中的 k-diff 数对(前后指针)925. 长按键入56. 合并区间532. 数组中的 k-diff 数对(前后指针)class Solution { public int findPairs(int[] nums, int k) { /** 分析: 题意中是要返回不同数对的数量,那么(1,2)和(2,1)其实本质是一样的,这里规定从小到大排序,即数对是非严格递增的==》将数组排好序,利用双指针特性,在合适的时候,进行前后原创 2021-09-30 20:28:34 · 258 阅读 · 0 评论 -
二分法总结
二分法刷题记录167. 两数之和 II - 输入有序数组167. 两数之和 II - 输入有序数组class Solution { public int[] twoSum(int[] numbers, int target) { // Map<Integer,Integer> map = new HashMap<>(); // for(int i = 0; i < numbers.length; i++){ //原创 2021-09-21 21:47:23 · 304 阅读 · 0 评论 -
算法技巧套路
算法技巧双指针法对撞指针快慢指针二分查找法滑动窗口加法模板双指针法这是一种使用两个指针互相配合来存储节点以便于运算的技巧适用于数组、链表等线性结构,常用思路有碰撞指针、滑动窗口、快慢指针。对撞指针leetcode第一题两数之和class Solution { public int[] twoSum(int[] nums, int target) { //双指针法 //采用对撞指针法,时间复杂度降低到 o(n) int len = n原创 2021-08-31 20:45:54 · 142 阅读 · 0 评论