
leecode练习
林有鹿s
这个作者很懒,什么都没留下…
展开
-
leetcode 数位DP整理
数位dp模板原创 2022-12-18 14:52:24 · 309 阅读 · 0 评论 -
leetcode manacher整理
manacher代码实现原创 2022-12-09 11:38:47 · 211 阅读 · 0 评论 -
leetcode 二分图整理
二分图原创 2022-12-04 17:36:47 · 104 阅读 · 0 评论 -
leetcode 前缀树trie整理
trie原创 2022-11-28 20:51:07 · 96 阅读 · 0 评论 -
leetcode 归并、快排、堆排序整理
排序原创 2022-11-28 20:23:53 · 198 阅读 · 0 评论 -
leetcode 并查集整理
并查集整理原创 2022-09-23 15:38:40 · 498 阅读 · 0 评论 -
leetcode算法基础 动态规划 01背包
01背包模板 有N件物品和一个最多能背重量为W 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。public static void testWeightBagProblem(int[] weight, int[] value, int bagWeight){ int wLen = weight.length; //定义dp数组:dp[j]表示背包容量为j时,能获得的最大价值 int[]原创 2021-11-23 14:01:08 · 322 阅读 · 0 评论 -
leetcode算法基础 二叉树非递归遍历
二叉树非递归原创 2021-10-24 13:29:44 · 132 阅读 · 0 评论 -
leetcode KMP整理
KMP原创 2021-10-24 12:22:01 · 776 阅读 · 0 评论 -
leetcode算法基础 单调队列及优先级队列
leetcode练习单调队列 239. 滑动窗口最大值优先级队列 347. 前 K 个高频元素单调队列 239. 滑动窗口最大值题目 单调队列要实现三个操作:移出滑动窗口左边界元素时,判断该元素和队列中头元素是否相同,相同则移除;加入队列时,判断加入元素是否大于队尾元素,如果大于,移除队尾元素直到队列空或者不大于队尾元素;返回当前滑动窗口的最大值,即单调队列的对头元素。 为了方便在滑动窗口移动时,单调队列的出队操作,可以将数组的下标存入队列,这样就可以直接判断该元素是否需要出队。class M原创 2021-10-24 10:49:07 · 278 阅读 · 0 评论 -
leetcode剑指Offer 链表(简单)
leetcode练习剑指 Offer 24. 反转链表剑指 Offer 35. 复杂链表的复制剑指 Offer 24. 反转链表题目一种思路是双指针,初始位置一个指向null,一个指向头结点。下面的方法是递归。public ListNode reverseList(ListNode head) { return recur(head, null); // 调用递归并返回}private ListNode recur(ListNode cur, ListNode pre) {原创 2021-10-11 15:27:07 · 100 阅读 · 0 评论 -
leetcode剑指Offer 二分查找(简单)
leetcode练习剑指 Offer 11. 旋转数组的最小数字剑指 Offer 53 - II. 0~n-1中缺失的数字剑指 Offer 11. 旋转数组的最小数字剑指 Offer 11. 旋转数组的最小数字题目public int minArray(int[] numbers) { int i = 0, j = numbers.length - 1; while (i < j) { int m = (i + j) / 2; if (number原创 2021-10-11 15:14:32 · 95 阅读 · 0 评论 -
leetcode剑指Offer 树(简单)
leetcode练习剑指 Offer 27. 二叉树的镜像剑指 Offer 28. 对称的二叉树剑指 Offer 32 - III. 从上到下打印二叉树 III记录一些很简单,但做题时又没有立马做出来的一些题目。剑指 Offer 27. 二叉树的镜像题目这道题用辅助栈或者辅助队列都是一样的效果。public TreeNode mirrorTree(TreeNode root) { if(root == null) return null; Stack<TreeNode>原创 2021-10-11 11:18:40 · 210 阅读 · 0 评论 -
leetcode算法基础 第十天 递归/回溯
leetcode练习40. 组合总和 II47. 全排列 II40. 组合总和 II题目解决数组里有重复元素的情况,就将数组排序,然后记录上次一次选择的元素,并在同层回溯中,不重复选择该元素,保证在每层回溯中,相同元素只会被选择一次。List<List<Integer>> re = new ArrayList<>();LinkedList<Integer> path = new LinkedList<>();public List<原创 2021-10-06 18:25:14 · 145 阅读 · 0 评论 -
leetcode算法基础 第九天 递归/回溯
leetcode练习78. 子集90. 子集 II78. 子集题目这道题也是套回溯模板,确定好每次的startIndex以及结束条件即可。List<List<Integer>> re = new ArrayList<>();LinkedList<Integer> path = new LinkedList<>();public List<List<Integer>> subsets(int[] nums) {原创 2021-10-06 17:33:02 · 137 阅读 · 0 评论 -
leetcode算法基础 第八天 深搜/广搜
leetcode练习1091. 二进制矩阵中的最短路径130. 被围绕的区域797. 所有可能的路径1091. 二进制矩阵中的最短路径题目使用广搜,每次将八个方向的值为0点加入队列,加入队列时将值改为1,以此类推,直到找到最终位置。public int shortestPathBinaryMatrix(int[][] grid) { if (grid[0][0] == 1 || grid[grid.length-1][grid[0].length-1] == 1) return -1;原创 2021-10-06 17:18:27 · 184 阅读 · 0 评论 -
leetcode算法基础 第七天 深搜/广搜
leetcode练习117. 填充每个节点的下一个右侧节点指针 II117. 填充每个节点的下一个右侧节点指针 II题目这道题,比较简单的思想就是层次遍历,每次遍历一层的节点,每层的节点数由n记录,不能直接i < queue.size()因为队列是在不停变化的。public Node connect(Node root) { if (root == null) return null; Queue<Node> queue = new LinkedList<&g原创 2021-10-06 16:14:34 · 81 阅读 · 0 评论 -
leetcode算法基础 第六天 深搜/广搜
leetcode练习200. 岛屿数量547. 省份数量**200. 岛屿数量题目这道题是一道简单的深搜题,首先双层遍历找到第一个’1’所在的位置,岛屿数加1,然后开始深搜,并将所有走过的地方标位’0’,以此类推,直到所有的位置都为’0’。public int numIslands(char[][] grid) { if (grid == null || grid.length == 0) { return 0; } int count = 0; fo原创 2021-10-05 15:34:32 · 101 阅读 · 0 评论 -
leetcode算法基础 第五天 滑动窗口
leetcode练习438. 找到字符串中所有字母异位词438. 找到字符串中所有字母异位词题目原创 2021-10-05 14:56:13 · 133 阅读 · 0 评论 -
leetcode算法基础 第四天 双指针
leetcode练习844.比较含退格的字符串986. 区间列表的交集11. 盛最多水的容器笔记:/*chs = [a,b,c,d]chs.toString() [C@5eobe858Arrays.toString(chs) [a,b,c,d]String.valueOf(chs) abcd*/844.比较含退格的字符串题目:这道题可以根据栈的思想,遇到字符就加入字符串,遇到退格就将字符换最后一位抛出。public boolean backspaceCompare(Strin原创 2021-09-20 17:12:49 · 90 阅读 · 0 评论 -
leetcode算法基础 第三天 双指针
双指针82. 删除排序链表中的重复元素 II[15. 三数之和](https://www.youkuaiyun.com/)82. 删除排序链表中的重复元素 IIpublic ListNode deleteDuplicates(ListNode head) { if (head ==null || head.next == null){ return head; } ListNode re = new ListNode(); re.next = head;原创 2021-09-15 08:52:14 · 90 阅读 · 0 评论 -
leetcode算法基础 第二天 二分查找
leecode练习153. 寻找旋转排序数组中的最小值162. 寻找峰值153. 寻找旋转排序数组中的最小值和之前一道题思路一致,每次判断是左边有序还是右边有序,左边有序将左边界加入最小值,否则将中间值加入最小值。public int findMin(int[] nums) { int re = Integer.MAX_VALUE; int left = 0, right = nums.length - 1; while (left <= right){原创 2021-09-14 21:54:06 · 71 阅读 · 0 评论 -
leecode算法基础 第一天 二分查找
leetcode练习33搜索旋转排序数组34.在排序数组中查找元素的起始和结束位置33搜索旋转排序数组 如果中间的数小于最右边的数,则右半段是有序的,若中间数大于最右边数,则左半段是有序的,我们只要在有序的半段里用首尾两个数组来判断目标值是否在这一区域内,这样就可以确定保留哪半边了。public int search(int[] nums, int target) { int len = nums.length; int left = 0, right = len-1; wh原创 2021-09-13 09:46:58 · 125 阅读 · 0 评论 -
Java文件读写操作
文件读写操作文件读写文件按字节或者按字符输入分多次读入文件文件按行读写文件读写InputSteam和OutputSream是以字节为单位的,Reader,Writer都是以字符为单位的操作,可以有效避免中文乱码。文件按字节或者按字符输入文件读FileInputStream readFile = null;//FileReader readFile = null; try { readFile = new FileInputStream("FileInputStreamDemo.java")原创 2021-09-12 19:47:10 · 162 阅读 · 0 评论 -
leetcode算法入门 第十四天 位运算
leetcode练习190.点到二进制位136.只出现一次的数字190.点到二进制位这道题可以直接调Integer.reverse()函数,但不符合位运算的思想public int reverseBits(int n) { int a = 0; for(int i = 0; i < 32; i++){ a = a + ((1 & (n >> i)) << ( 31 - i)); } return a;}上面的思原创 2021-09-12 10:52:22 · 204 阅读 · 0 评论 -
leetcode算法入门 第十三天 位运算
leetcode练习231.2的幂191.位1的个数 第一次接触位运算的题目,看了别人的博客得到了两个结论:第一个,byte->int可以保证十进制数不发生变化,但是对应的二进制数会发生变化。所以负数补符号位扩展,保证十进制数不变。补零扩展,保证补码的一致性,但是表示的十进制发生变化。第二个:补零扩展,保证补码的一致性,但是表示的十进制发生变化。补零扩展,即&0xff的操作。231.2的幂/**位运算思路: * 2^x = n 因为n 与 n-1 必然为0 比如8(1000) 7(0原创 2021-09-11 19:56:51 · 124 阅读 · 0 评论 -
leetcode算法入门 十二天 动态规划
leetcode练习70.爬楼梯198.打家劫舍120.三角形最小路径和70.爬楼梯这道题和斐波那契数列很像,找到递推公式F(n) = F(n-1) + F(n-2)。但是这道题不能使用递归,会造成超时,只能迭代。public int climbStairs(int n) { if(n == 0 || n == 1) return 1; int a = 1, b = 1, c = 0; for (int i = 0; i < n - 1; i++){ c原创 2021-09-10 22:07:51 · 70 阅读 · 0 评论 -
leetcode算法入门 第十一天 递归/回溯**
leetcode练习77.组合39.组合总和131.分割回文串求字符串的所有子串回溯的模板void backtracking(参数) { if (终止条件) { 存放结果; return; } for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) { 处理节点; backtracking(路径,选择列表); // 递归 回溯,撤销处理结果 }}77.组合ArrayL原创 2021-09-07 13:49:24 · 113 阅读 · 0 评论 -
leetcode算法入门 第十天 递归/回溯
leetcode练习206.反转列表21.合并两个有序链表206.反转列表这道题其实没什么难度,思路对了很快就可以做出来,注意递归的思路。//迭代法public ListNode reverseList(ListNode head) { ListNode pre = null; ListNode cur = head; while(cur!=null) { ListNode next = cur.next; cur.next = pre;原创 2021-09-07 09:20:55 · 125 阅读 · 0 评论 -
leetcode 算法入门 第九天深搜/广搜
leetcode练习542.01 矩阵994.腐烂的橘子542.01 矩阵这道题和最大岛屿问题还是有一定区别的,使用深搜比较麻烦。其实可以将这道题转换成动态规划问题或者广搜问题会比较好解决一点。DP方法:先正序遍历矩阵,每次根据左方和上方已经得出的结果来更新矩阵。再逆序遍历矩阵,根据右方和下方值来更新矩阵。两次遍历得到最终矩阵。public int[][] updateMatrix(int[][] mat) { int row = mat.length; int col = mat[原创 2021-09-05 17:03:28 · 178 阅读 · 0 评论 -
leetcode算法入门 第八天 深搜/广搜
leetcode练习617.合并二叉树617.合并二叉树该题是一道简单的二叉树前序遍历。public TreeNode mergeTrees(TreeNode t1, TreeNode t2) { if (t1 == null) { return t2; } if (t2 == null) { return t1; } // 先合并根节点 t1.val += t2.val; // 再递归合并左右子树 t1.原创 2021-09-04 16:16:24 · 121 阅读 · 0 评论 -
leetcode算法入门 第七天 广度优先搜索/深度优先搜索
leecode练习733.图像渲染695.岛屿最大面积733.图像渲染这道题题目很绕,其实就是一道深度优先搜索,将像素值相同的所有连通区域修改成新的像素值,只需要记录旧的像素值进行递归遍历即可。public int[][] floodFill(int[][] image, int sr, int sc, int newColor) { int oldColor = image[sr][sc]; dfs(image,sr,sc, oldColor,newColor);原创 2021-09-04 15:32:54 · 197 阅读 · 0 评论 -
leetcode算法入门 第六条 滑动窗口**
leetcode练习3.无重复字符的最长子串3.无重复字符的最长子串public int lengthOfLongestSubstring(String s) {// 记录字符上一次出现的位置int[] last = new int[128];for(int i = 0; i < 128; i++) {last[i] = -1;}int n = s.length(); int res = 0; int start = 0; // 窗口开始位置 for(int i原创 2021-09-02 11:06:49 · 97 阅读 · 0 评论 -
leetcode算法入门 第五天 双指针
leetcode练习876.链表的中间节点19.删除链表的倒数N个元素876.链表的中间节点先遍历一遍列表,记录列表的长度,得出中间列表的长度。 public ListNode middleNode(ListNode head) { ListNode p = head; ListNode re = p; int i = 0; while(p != null){ i++; p = p.next原创 2021-08-31 11:15:32 · 114 阅读 · 0 评论 -
leetcode算法入门 第四天 双指针
leetcode 练习344.反转字符串557.反转字符串中的单词III344.反转字符串public void reverseString(char[] s) { int left = 0; int right = s.length-1; while(left<right){ char a = s[left]; s[left] = s[right]; s[right] = a;原创 2021-08-30 22:10:36 · 137 阅读 · 0 评论 -
leetcode数据结构入门 第三条 数组**
leetcode练习350.两个数组的交集II121.买卖股票的最佳时间350.两个数组的交集IIpublic int[] intersect(int[] nums1, int[] nums2) { List<Integer> list1 = new ArrayList<>(); for (int num : nums1) { list1.add(num); } List<Integer原创 2021-08-25 21:18:18 · 117 阅读 · 0 评论 -
leetcode算法入门 第三天 双指针
leetcode练习283.移动零167.两数之和II283.移动零public void moveZeroes(int[] nums) { int a = 0; for(int i=0;i<nums.length;i++){ if(nums[i]!=0){ nums[a]=nums[i]; a++; } } for(int原创 2021-08-25 18:11:27 · 89 阅读 · 0 评论 -
leetcode算法入门 第二天双指针
leetcode练习977.有序数组的平方189.旋转数组977.有序数组的平方 public int[] sortedSquares(int[] nums) { for(int i =0;i<nums.length;i++){ nums[i] = nums[i]*nums[i]; } Arrays.sort(nums); return nums; }用的多了就学会了用Arrays.sort(原创 2021-08-22 22:09:24 · 148 阅读 · 0 评论 -
leetcode数据结构入门 第二天 数组
leetcode练习88.合并两个有序数组88.合并两个有序数组public void merge(int[] nums1, int m, int[] nums2, int n) { //逆向双指针法 int i=m-1; int j=n-1; int index=nums1.length-1; while(i>=0 && j>=0) { if(nums1[原创 2021-08-22 10:09:28 · 160 阅读 · 0 评论 -
leetcode算法入门 第一天 二分查找
LeetCode练习704.二分查找35.搜索插入位置704.二分查找public int search(int[] nums, int target) { int low = 0; int high = nums.length -1; int mid; while(low <= high){ mid = low + (high - low) / 2; if(nums[mid] == t原创 2021-08-21 12:01:15 · 198 阅读 · 0 评论