![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
力扣刷题
不过普通话一乙不改名
凡事预则立,不预则废
展开
-
(多种方法)重排链表
题解一:(队列法)方法二:(拆解链表,反转链表,链表合并)原创 2022-06-17 12:45:27 · 2021 阅读 · 1 评论 -
(递归法)反转链表
反转链表原创 2022-06-16 12:00:28 · 92 阅读 · 0 评论 -
kmp模式字符串匹配算法
kmp算法文章推荐原创 2022-06-07 14:31:21 · 82 阅读 · 0 评论 -
有效的回文,最多删除一个字符得到回文,回文链表
题目一:有效的回文解法一:class Solution { public boolean isPalindrome(String s) { int n = s.length(); int left = 0, right = n - 1; while (left < right) { while (left < right && !Character.isLetterOrDigit(s.charA原创 2022-05-31 15:25:39 · 74 阅读 · 0 评论 -
(不定长滑动窗口)含有所有字符的最短字符串
题目:代码:public String minWindow(String s, String t) { // 两个map, 一个存放target的字符和数量, 另一个存放s字符出现在t中的字符和数量 HashMap<Character, Integer> need = new HashMap<>(); HashMap<Character, Integer> windows = new HashMap<>(原创 2022-05-26 12:48:40 · 91 阅读 · 0 评论 -
(定长滑动窗口)字符串中的所有变位词
题目:代码:public List<Integer> checkInclusion(String s1, String s2) { // need存放s1的字符和个数, window当作滑动窗口字符的计数 HashMap<Character, Integer> need = new HashMap<>(); HashMap<Character, Integer> windows = new HashMap&原创 2022-05-26 10:48:35 · 64 阅读 · 0 评论 -
(双指针)排序数组中两个数字之和
题目:解法:/** * 基本思路:双指针 * @param numbers * @param target * @return */ public int[] twoSum(int[] numbers, int target) { // 初始化左右指针 int left = 0, right = numbers.length-1; while (left < right){原创 2022-05-20 16:57:23 · 83 阅读 · 0 评论 -
(双指针)数组中和为 0 的三个数
题目:题解:/** * 解析:有一道题叫做 在排序数组中找两数等于目标数 的题目,用的就是双指针法。 * 这道题是三数之和等于0,稍加改变就是两数等于第三个数字的负数。但是,要防止找重复的三个数字。所以,需要加防重设计。 * @param nums * @return */ public List<List<Integer>> threeSum(int[] nums) { Arrays.sort原创 2022-05-20 16:46:25 · 104 阅读 · 0 评论 -
(位运算+动态规划)前 n 个数字二进制中 1 的个数
一:题目:二:解答题解:对于所有的数字,只有奇数和偶数两种:奇数:二进制表示中,奇数一定比前面那个偶数多一个 1,因为多的就是最低位的 1。偶数:二进制表示中,偶数中 1 的个数一定和除以 2 之后的那个数一样多。因为最低位是 0,除以 2 就是右移一位,也就是把那个 0 抹掉而已,所以 1 的个数是不变的。所以我们可以得到如下的状态转移方程:dp[i] = dp[i-1],当i为奇数dp[i] = dp[i/2],当i为偶数上面的方程还可进一步合并为:dp[i] = dp[i/2原创 2022-05-16 15:40:55 · 197 阅读 · 0 评论 -
(位运算)二进制加法
一:题目:二:解答题解:记得之前写过一道题,跟这个很类似,不用加减乘除做加法,所以我们只要把这个二进制字符串转换为Interger整数,然后套用这个方法。代码:public String test2(String a, String b){ int a1 = Integer.parseInt(a, 2); int b1 = Integer.parseInt(b, 2); while (b1 != 0){ int c = (a原创 2022-05-16 15:01:02 · 833 阅读 · 0 评论 -
剑指 Offer 64. 求1+2+…+n
题目:解法:代码:class Solution { public int sumNums(int n) { boolean x = n > 1 && (n += sumNums(n - 1)) > 0; return n; }}Java 中,为构成语句,需加一个辅助布尔量 xx ,否则会报错;Java 中,开启递归函数需改写为 sumNums(n - 1) > 0 ,此整体作为一个布尔量输出,否则会报错;原创 2022-05-13 09:58:04 · 860 阅读 · 0 评论 -
剑指 Offer 65. 不用加减乘除做加法(位运算)
题目:题解:虽然s = a + b = n + c,但是n + c还是用了’+',因此我们对n + c再次采用这种运算 (也就是把n当成a,c当成b,继续做a+b运算。看似无限循环,但是进位c总会有等于0的时候,此时结果就等于n)代码:class Solution { public int add(int a, int b) { while(b != 0) { // 当进位为 0 时跳出 int c = (a & b) << 1原创 2022-05-13 09:50:12 · 150 阅读 · 0 评论 -
剑指 Offer 62. 圆圈中最后剩下的数字(动态规划)
题目:题解:通过数学推导,得到该题的状态转移方程式,这个方程式说真的,挺难推导的,一般人想不到。解法一:(动态规划)class Solution { public int lastRemaining(int n, int m) { int x = 0; for (int i = 2; i <= n; i++) { x = (x + m) % i; } return x; }}..原创 2022-05-13 09:25:52 · 76 阅读 · 0 评论 -
不严格单调栈或者队列的应用汇总
第一题:包含min函数的栈1.题目2.解法class MinStack { Stack<Integer> A, B; public MinStack() { A = new Stack<>(); B = new Stack<>(); } public void push(int x) { A.add(x); if(B.empty() || B.peek() >=原创 2022-05-09 09:19:02 · 158 阅读 · 0 评论 -
剑指offer58-翻转单词顺序(双指针)
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。示例:解法一(双指针法):public String reverseWords(String s) { s = s.trim(); int i = s.length()-1, j = i; StringBuilder builder = new St原创 2022-05-06 08:19:48 · 74 阅读 · 0 评论 -
剑指 Offer 52. 两个链表的第一个公共节点(双指针)
题目:输入两个链表,找出它们的第一个公共节点。例子:解法一(双指针):public ListNode getIntersectionNode(ListNode headA, ListNode headB) { ListNode A = headA; ListNode B = headB; while (A != B){ A = A!=null ? A.next : headB; B = B!=null原创 2022-04-25 09:56:26 · 322 阅读 · 0 评论 -
剑指 Offer 60. n个骰子的点数(动态规划)
题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。例子:题解代码:public double[] dicesProbability(int n) { double[] dp = new double[6]; Arrays.fill(dp, 1.0/6.0); for (int i = 2;原创 2022-04-21 10:07:31 · 96 阅读 · 0 评论 -
删除链表的节点-剑指 Offer 18.
题目:给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。例子:题解1:(双指针)public ListNode deleteNode(ListNode head, int val) { ListNode pre = null; ListNode post = head; while (head.getVal()!=val){ // 指针后移,知道post等于目标值原创 2022-03-11 09:19:40 · 519 阅读 · 0 评论 -
数值的整数次方(剑指 Offer 16.)
题目:实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。例子:解法一(暴力):public Soult{public double myPow1(double x, int n) { if (x == 0) return 0; if (n == 0) return 1; double flag = 1; double sum = 1; if (n <原创 2022-03-01 18:10:33 · 54 阅读 · 0 评论 -
剑指 Offer 15. 二进制中1的个数
题目;编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量).)。例子:解法1:(与1相与移位)public class Solute { public int hammingWeight(int n) { int count = 0; while (n != 0){ //与1,可以判断最末尾是否为1. if ((n & 1) ==原创 2022-03-01 09:25:42 · 126 阅读 · 0 评论 -
剑指 Offer 14- I. 剪绳子
题目:给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。例子:解法1:(导数求解)public class Solute { public int cuttingRope(int n) { if (n <原创 2022-03-01 09:09:46 · 51 阅读 · 0 评论 -
剑指 Offer 12. 矩阵中的路径(DFS+回溯)
题目:给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。例子:解法1(DFS+回溯):public class Solute { /** * 此算法用的是DFS+剪枝算法 * @param board * @para原创 2022-02-28 10:25:03 · 232 阅读 · 0 评论 -
剑指offer11:旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为1。例子:解法1:(二分递归法)public class Solute { private int min; public int minArray(int[] numbers )原创 2022-02-25 12:48:13 · 57 阅读 · 0 评论 -
剑指offer 前序中序画出二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例子:题解1:class Solution { //利用原理,先序遍历的第一个节点就是根。在中序遍历中通过根 区分哪些是左子树的,哪些是右子树的 //左右子树,递归 HashMap<Integer, Integer> map = new HashMap<>();//标记中序遍历 int[] preorder;//原创 2022-02-16 16:20:07 · 51 阅读 · 0 评论 -
剑指 Offer 03. 数组中重复的数字
题目:找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例子:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3解法一:(HashSet)和解法二(下标法)class Solution { public int findRepeatNumber1(int[] nums) { HashSet<原创 2022-02-14 11:19:35 · 57 阅读 · 0 评论 -
剑指 Offer 45. 把数组排成最小的数
题目:输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例子:代码1:class Solution { public String minNumber(int[] nums) { sort(nums, 0, nums.length-1); StringBuffer stringBuffer = new StringBuffer(); for (int num : nums) {原创 2022-01-06 17:08:15 · 377 阅读 · 0 评论 -
数组中的逆序对
题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例子:代码1(分治法):class Solution { public int reversePairs(int[] nums) { int len = nums.length; //数组长度太小,直接返回0 if (len < 2){ return 0; }原创 2021-12-07 18:18:41 · 71 阅读 · 0 评论 -
字符串的排列(回溯)
题目:输入一个字符串,打印出该字符串中字符的所有排列。例子:总而言之,就是不带重复的排列组合。代码1:(回溯):import java.util.HashSet;import java.util.LinkedList;import java.util.List;class Solution { //用来放所有可能的排列 private List<String> list = new LinkedList(); //将String s 转换为char[原创 2021-12-02 11:36:00 · 335 阅读 · 0 评论 -
数值的整数次方
题目:实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。例子:代码1(快速幂法):class Solution { public double myPow(double x, int n) { double result = 1; int count = n>0?n:-n; while (n>0){ result *= x;原创 2021-11-30 09:44:53 · 58 阅读 · 0 评论 -
顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例子:代码1:class Solution { /* * 思路: *定义四个方向上下左右,从左至右开始遍历,走到不能走为止(碰到左右边界)。 *跳出循环的条件:index=数组元素个数 */ public int[] spiralOrder(int[][] matrix) { if(matrix.length==0) return new i原创 2021-11-29 11:33:28 · 69 阅读 · 0 评论 -
二进制中1的个数
题目:编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量).)。例子:代码1:class Solution { // you need to treat n as an unsigned value public int hammingWeight(int n) { int count = 0; while (n != 0){ count += n&原创 2021-11-29 09:57:45 · 136 阅读 · 0 评论 -
二叉树的公共祖先
题目:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。例子:代码1:(先序遍历):class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if(root == null || root == p || root == q) return root; TreeNode left = lowestCommonAncesto原创 2021-11-23 10:15:24 · 1120 阅读 · 0 评论 -
二叉搜索树的最近公共祖先
题目:给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例子:代码1(递归):class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { //都比root原创 2021-11-22 11:42:49 · 446 阅读 · 0 评论 -
平衡二叉树
题目:输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。例子:代码1(递归):class Solution { boolean isbalanced = true; public boolean isBalanced(TreeNode root) { balanced(root); return this.isbalanced; } //求树的最大深度代码原创 2021-11-22 10:46:12 · 295 阅读 · 0 评论 -
给定一棵二叉搜索树,请找出其中第k大的节点(中序遍历)
题目:给定一棵二叉搜索树,请找出其中第k大的节点。例子:代码1:(递归法)class Solution { int k,val; public int kthLargest(TreeNode root, int k) { this.k = k; fun(root); return val; } public void fun(TreeNode root){ if (root==null) return原创 2021-11-20 11:14:59 · 247 阅读 · 0 评论 -
二叉树中和为某一值的路径(回溯+DFS)
题目:给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。例子:代码1(前序遍历+回溯):import java.util.LinkedList;import java.util.List;class Solution { //初始化两个链表 List<List> lists = new LinkedList<>(); LinkedL原创 2021-11-19 10:28:59 · 201 阅读 · 0 评论 -
序列化二叉树
题目:请实现两个函数,分别用来序列化和反序列化二叉树。例子:代码1:import java.util.ArrayList;import java.util.LinkedList;class Solution { // Encodes a tree to a single string. public String serialize(TreeNode root) { //创建队列并加入根节点 LinkedList<TreeNode>原创 2021-11-18 11:37:00 · 433 阅读 · 0 评论 -
二叉树的深度
题目:输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。例子:代码1(队列循环法):import java.util.LinkedList;class Solution { public int maxDepth(TreeNode root) { //定义一个队列 LinkedList<TreeNode> queue = new LinkedList<>原创 2021-11-18 09:29:59 · 303 阅读 · 0 评论 -
二叉搜索树与双向链表
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。例子:代码1(递归+中序遍历)class Solution { //pre指向中序遍历前一个节点,head为头指针 TreeNode pre, head; public TreeNode treeToDoublyList(TreeNode root){ mediean(root); //循环链表拉起来 head.s原创 2021-11-17 11:23:37 · 319 阅读 · 0 评论 -
机器人的运动范围(回溯算法)
题目:地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?例子:代码1(深度遍历):class Solution { int limitm原创 2021-11-16 11:04:38 · 111 阅读 · 0 评论