算法
文章平均质量分 56
Sparky*
只有经历过一切,才有资格选择
展开
-
KMP算法
文章目录KMP算法介绍KMP算法最佳应用字符串匹配问题字符串匹配问题思路分析图解KMP算法介绍KMP是一个解决模式串在文本串是否出现过,如果出现过,最早出现的位置的经典算法Knuth- MorTis- Pratt字符串查找算法,简称为"KMP算法",常用于在一个文本串S内查找一个模式串P的出现位置,这个算法由 Donald Knuth、 Vaughan pratt、James H.Morris三人于1977年联合发表,故取这3人的姓氏命名此算法KMP方法算法就利用之前判断过信息,通过一个next数原创 2021-09-13 13:49:22 · 108 阅读 · 0 评论 -
剑指 Offer 57 - II. 和为s的连续正数序列
文章目录题目描述思路分析代码实现题目描述输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。示例 1:输入:target = 9输出:[[2,3,4],[4,5]]示例 2:输入:target = 15输出:[[1,2,3,4,5],[4,5,6],[7,8]]思路分析双层for循环,每次循环都进行累加,如果等于target就记录下来,超过了就跳出循环,从下一个数开始进行累加原创 2020-11-15 22:48:48 · 370 阅读 · 0 评论 -
剑指 Offer 45. 把数组排成最小的数
文章目录题目描述解题思路代码实现题目描述输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。示例 1:输入: [10,2]输出: “102”示例 2:输入: [3,30,34,5,9]输出: “3033459”解题思路通过在排序时传入一个自定义的 Comparator 实现,重新定义 String 列表内的排序方法,若拼接 s1 + s2 > s2 + s1,那么显然应该把 s2 在拼接时放在前面,以此类推,将整个 String 列原创 2020-11-15 08:08:18 · 435 阅读 · 0 评论 -
剑指 Offer 46 把数字翻译成字符串
文章目录题目描述思路图解代码实现题目描述思路图解代码实现 public int translateNum(int num) { String s = String.valueOf(num); int n = s.length(); int dp[] = new int[n + 1]; dp[0] = 1; dp[1] = 1; for (int i = 2; i <= s.length(); i++) { String tmp = s.substring(i原创 2020-11-14 20:43:04 · 416 阅读 · 0 评论 -
面试题 16.19. 水域大小
文章目录面试题 16.19. 水域大小思路分析代码实现面试题 16.19. 水域大小思路分析首先我们能想到要做的第一件事就是遍历矩阵,遇到0之后就开始搜索周围是否还有0,这里搜索的过程要用到递归,那么递归的返回条件就是land[x][y] != 0或索引x和y越界。值得一提的是,我们要注意在写if语句的时候索引x y越界的判断一定要放在land[x][y] != 0的后面!如果先判断!=0就有可能会报错提示越界。为了避免在递归的时候重复判断矩阵中的0,因为在判断池塘个数的过程中,每个0只会被记录原创 2020-10-15 21:48:23 · 400 阅读 · 0 评论 -
动态规划题目
面试题10- I. 斐波那契数列 //递归法:超时!!! public int fib(int n) { if (n == 0) return 0; if (n == 1) return 1; return fib(n-1)+fib(n-2); } public int fib1(int n) { /** * 由于 dp列表第 i 项只与第 i−1 和第 i−2项有关, * 因此只需要初始化三个整形变量 sum, a, b ,利用辅助变量 sum原创 2020-10-14 21:53:17 · 381 阅读 · 0 评论 -
数学问题
文章目录1.快乐数1.快乐数 public boolean isHappy(int n) { Set<Integer> seen=new HashSet<Integer>(); while (n!=1&&!seen.contains(n)) { seen.add(n); n=getNext(n); } return n==1; } private int getNext(int n) { int totalSum=0;原创 2020-10-13 22:31:00 · 407 阅读 · 1 评论 -
Leetcode49:字母异位词分组
文章目录题目描述代码实现题目描述代码实现 /** * 1,先排序再判断 字母异位词就是两个字符串中的字母都是一样的, 只不过顺序被打乱了,这里要把他们找出来,然后放到一起。 既然字母异位词的字母都是一样的,可以对字符串中的字符进行排序, 生成一个新的字符串,如果生成新的字符串相同,那么他们就是字母异位词。 * */ public List<List<String>> groupAnagrams(String[] strs) { //边界条件判断原创 2020-10-13 20:41:41 · 344 阅读 · 0 评论 -
Leetcode20:有效的括号
文章目录题目描述思路分析代码实现题目描述示例 1:输入: “()”输出: true示例 2:输入: “()[]{}”输出: true示例 3:输入: “(]”输出: false示例 4:输入: “([)]”输出: false示例 5:输入: “{[]}”输出: true思路分析代码实现 public boolean isValid(String s) { //1.特判 if (s.isEmpty()) { return true;原创 2020-10-12 22:25:01 · 370 阅读 · 0 评论 -
Leetcode518:零钱兑换
文章目录题目描述代码实现题目描述给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。示例 1:输入: amount = 5, coins = [1, 2, 5]输出: 4解释: 有四种方式可以凑成总金额:5=55=2+2+15=2+1+1+15=1+1+1+1+1示例 2:输入: amount = 3, coins = [2]输出: 0解释: 只用面额2的硬币不能凑成总金额3。示例 3:输入: amount = 1原创 2020-10-11 22:41:03 · 373 阅读 · 0 评论 -
Leetcode547:朋友圈
文章目录题目描述代码实现深度搜索代码题目描述班上有 N 名学生。其中有些人是朋友,有些则不是。他们的友谊具有是传递性。如果已知 A 是 B 的朋友,B 是 C 的朋友,那么我们可以认为 A 也是 C 的朋友。所谓的朋友圈,是指所有朋友的集合。给定一个 N * N 的矩阵 M,表示班级中学生之间的朋友关系。如果M[i][j] = 1,表示已知第 i 个和 j 个学生互为朋友关系,否则为不知道。你必须输出所有学生中的已知的朋友圈总数。示例1输入:[[1,1,0],[1,1,0],[0,0,1]原创 2020-10-11 22:31:21 · 534 阅读 · 0 评论 -
Leetcode198:打家劫舍
文章目录题目描述思路分析代码实现题目描述思路分析详细解析请转自此观看代码实现 public int rob(int[] nums) { if (nums.length == 0) { return 0; } int N = nums.length; int[] dp = new int[N + 1]; dp[0] = 0; dp[1] = nums[0]; for (int k = 2; k <= dp.length; k++) { dp[k]原创 2020-10-11 10:10:57 · 411 阅读 · 0 评论 -
Java中对只有两列的数组排序
文章目录 public static void main(String[] args) { int[][]events= new int[][]{{1,1},{5,1},{3,4}}; maxEvents(events); } public static int maxEvents(int[][] events) { Arrays.sort(events, (o1, o2) -> o1[1] - o2[1]); for (int i = 0; i < events.原创 2020-10-07 19:44:19 · 537 阅读 · 0 评论 -
Leetcode973:最接近原点的 K 个点
文章目录题目描述思路分析代码实现题目描述我们有一个由平面上的点组成的列表 points。需要从中找出 K 个距离原点 (0, 0) 最近的点。(这里,平面上两点之间的距离是欧几里德距离。)你可以按任何顺序返回答案。除了点坐标的顺序之外,答案确保是唯一的。示例 1:输入:points = [[1,3],[-2,2]], K = 1输出:[[-2,2]]解释:(1, 3) 和原点之间的距离为 sqrt(10),(-2, 2) 和原点之间的距离为 sqrt(8),由于 sqrt(8) &原创 2020-10-07 15:44:21 · 443 阅读 · 0 评论 -
关于链表的算法
文章目录1. 删除链表中的节点2.删除链表的倒数第N个节点3.反转链表4.合并两个有序链表1. 删除链表中的节点public class LC27 { public void deleteNode(ListNode node) { node.val = node.next.val; node.next = node.next.next; }}class ListNode { int val; ListNode next; public ListNode(int x) { v原创 2020-10-06 14:25:04 · 402 阅读 · 0 评论 -
Leecode字符串题目
文章目录1.反转字符串2.整数反转3.字符串中的第一个唯一字符4.有效的字母异位词5.实现strStr()1.反转字符串 public void reverseString(char[] s) { //左右双指针 int left=0; int right=s.length-1; //交换元素的临时变量temp char temp; while (left<right) { temp=s[left]; s[left++]=s[right]; s[r原创 2020-10-03 10:13:05 · 386 阅读 · 0 评论 -
Leetcode1:两数之和
文章目录题目描述思路分析代码实现题目描述思路分析代码实现 public int[] twoSum(int[] nums, int target) { Map<Integer, Integer> map=new HashMap<Integer, Integer>(); for (int i = 0; i < nums.length; i++) { if (map.containsKey(target-nums[i])) { return new原创 2020-10-03 08:51:01 · 338 阅读 · 0 评论 -
Leetcode8:字符串转整型
文章目录题目描述代码实现题目描述示例 1:输入: “42”输出: 42示例 2:输入: " -42"输出: -42解释: 第一个非空白字符为 ‘-’, 它是一个负号。我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。示例 3:输入: “4193 with words”输出: 4193解释: 转换截止于数字 ‘3’ ,因为它的下一个字符不为数字。示例 4:输入: “words and 987”输出: 0解释: 第一个非空字符是 ‘w’,原创 2020-10-02 11:21:25 · 350 阅读 · 0 评论 -
Leetcode66:加一
文章目录题目描述思路分析代码实现题目描述思路分析加1情况分两种9+1除9以外的数字+1倒序循环数组中的每一个元素,如果加1之后数组不再需要进位就return。当数字是类似999,99时,将数组长度+1,把第0个元素赋值为1返回即可代码实现 public int[] plusOne(int[] digits) { for (int i = digits.length-1; i>=0; i--) { digits[i]++; digits[i]=digits[i]%原创 2020-09-27 11:17:44 · 83 阅读 · 0 评论 -
Leetcode350:两个数组的交集 II
文章目录题目描述思路分析代码实现题目描述思路分析1.先对两个数组排序2.建立f1、f2指针,分别指向nums1数组、nums2数组的下标3.若nums1[f1]<nums[f2],则指针f1移动一位;若num1[f1]>nums[f2],则指针f2移动一位;若相等,便是找到了两个数组的交集之一,加入动态数组list中4.重复步骤3,直到其中一个数组迭代完,便退出循环5.将动态数组arrl赋值给静态数组ans,并返回ans代码实现 public static int[] int原创 2020-09-27 10:53:15 · 104 阅读 · 0 评论 -
Leetcode:存在重复元素ⅠⅡⅢ
文章目录Leetcode217:存在重复元素题目描述代码实现Leetcode217:存在重复元素Ⅱ题目描述思路分析代码实现Leetcode220:存在重复元素Ⅲ题目描述解题思路Leetcode217:存在重复元素题目描述代码实现解法一:如果存在重复元素,排序后它们相邻。public boolean containsDuplicate(int[] nums) { Arrays.sort(nums); for (int i = 0; i < nums.length-1; i++) {原创 2020-09-26 15:54:43 · 232 阅读 · 0 评论 -
Leetcode189:旋转数组
文章目录题目描述解法一(暴力法)解法二(使用额外的数组)题目描述解法一(暴力法)最简单的方法是旋转 k 次,每次将数组旋转 1 个元素。 public void rotate(int[] nums, int k) { int temp,previous; //外层for循环表示一共移动k次,每次都将所有元素移动一个距离长度 for (int i = 0; i < k; i++) { //保存下一个元素 previous=nums[nums.length-1];原创 2020-09-26 14:55:45 · 86 阅读 · 0 评论 -
Leetcode209:长度最小的子数组
文章目录题目描述解法一(暴力法)解法二(滑动窗口)题目描述给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。示例:输入:s = 7, nums = [2,3,1,2,4,3]输出:2解释:子数组 [4,3] 是该条件下的长度最小的子数组。解法一(暴力法) public int minSubArrayLen(int s, int[] nums) { int mi原创 2020-09-26 12:20:07 · 108 阅读 · 0 评论 -
数组类算法
文章目录移动零题目描述代码实现移除元素题目描述代码实现删除排序数组中的重复项题目描述代码实现删除排序数组中的重复项 II题目描述代码实现颜色分类题目描述代码实现具体解析移动零题目描述给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]代码实现public void moveZeroes(int[]nums) {/**使用两个指针: i --> 当前遍历的元素下标原创 2020-09-26 08:54:02 · 588 阅读 · 0 评论 -
Leetcode54:螺旋矩阵
文章目录题目描述代码实现视频讲解题目描述代码实现 public List<Integer> spiralOrder(int[][]matrix){ List<Integer>res=new ArrayList<Integer>(); if (matrix==null||matrix.length==0||matrix[0]==null||matrix[0].length==0) { return res; } int rowBegin=原创 2020-09-25 11:43:48 · 199 阅读 · 0 评论 -
Leetcode474:一和零
文章目录题目描述思路分析代码实现题目描述思路分析代码实现 public int findMaxForm(String[] strs,int m,int n) { int[][]dp=new int[m+1][n+1]; for (String s : strs) { int[] count=countzeroesones(s); for (int zeroes = m; zeroes >= count[0]; zeroes--) { for (int one原创 2020-09-24 21:51:50 · 80 阅读 · 0 评论 -
Leetcode73:矩阵置零
文章目录题目描述代码实现题目描述给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。代码实现 /** * 对于这个矩阵中,只要元素为0,那么他所在的行的第一个元素和列的一个元素一定是0 * 定义row和col两个布尔变量,为了记录第一行和第一列是否需要遍历为0 * */ public void setZeroes(int[][] matrix) { if (matrix==null||matrix.length==0||ma原创 2020-09-24 11:52:09 · 125 阅读 · 0 评论 -
Leetcode75:颜色分类
文章目录题目描述思路分析代码实现题目描述思路分析left追踪0的最右边界right追踪2的最左边接index追踪当前考虑的元素沿着数组移动index指针若nums[index]=0,则将其与nums[left]互换;若nums[index]=2,则将其与nums[right]互换代码实现 public static void sortColors(int[] nums) { if (nums==null||nums.length==0) return; int left=0原创 2020-09-23 22:33:14 · 139 阅读 · 0 评论 -
《算法很美》第五章
文章目录1.判断字符串有无重复字符2.翻转字符串1.判断字符串有无重复字符public static boolean checkDifferent(String iniString) { if (iniString.isEmpty()) { return true; } int[] flag=new int[128]; //扫描字符串 for (int i = 0; i < iniString.length(); i++) { int c=(int)(iniStri原创 2020-09-20 12:08:06 · 101 阅读 · 0 评论 -
Leetcode60:第k个排列(附加视频解析)
文章目录题目描述代码实现视频链接题目描述代码实现public String getPermutation(int n, int k) { List<Integer> res = new ArrayList<Integer>(); // 将1-n中的数字加入列表 for (int i = 1; i <= n; i++) { res.add(i); } // fact用于保存第i个数除第一位之后有多少种排列方式 int[] fact = ne原创 2020-09-06 18:18:30 · 108 阅读 · 0 评论 -
Leetcode783:二叉搜索树节点最小距离
文章目录题目描述思路分析代码实现题目描述给定一个二叉搜索树的根节点 root,返回树中任意两节点的差的最小值。示例:输入: root = [4,2,6,1,3,null,null]输出: 1解释:注意,root是树节点对象(TreeNode object),而不是数组。给定的树 [4,2,6,1,3,null,null] 可表示为下图: 4 / \ 2 6 / \ 1 3 最小的差值是 1, 它是节点1和节点2的差值, 也是节点原创 2020-07-31 09:30:52 · 320 阅读 · 0 评论 -
Leetcode343:整数拆分
文章目录题目描述思路分析代码实现题目描述给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。示例1:输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1。示例2:输入: 10输出: 36解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。思路分析设将整数 n拆分为 a个小数字:n=n1+n2+...n = n _ { 1 } + n _ { 2 } + ...n=n1+n2+...+n原创 2020-07-30 22:11:54 · 125 阅读 · 0 评论 -
Leetcode104:二叉树的最大深度
文章目录题目描述思路分析代码实现题目描述思路分析如果我们知道了左子树和右子树的最大深度 leftMaxDepth 和 rightMaxDepth,那么该二叉树的最大深度即为:max(leftMaxDepth, rightMaxDepth)+1而左子树和右子树的最大深度又可以以同样的方式进行计算。因此我们在计算当前二叉树的最大深度时,可以先递归计算出其左子树和右子树的最大深度,然后在 O(1) 时间内计算出当前二叉树的最大深度。递归在访问到空节点时退出。思路演示maxDepth(root-3原创 2020-07-28 10:38:14 · 104 阅读 · 0 评论 -
面试题16. 数值的整数次方(快速幂,清晰图解)
文章目录1.题目描述2.思路分析*算法流程:注意事项(整数越界)代码实现个人想法1.题目描述实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。示例 1:输入: 2.00000, 10输出: 1024.00000示例 2:输入: 2.10000, 3输出: 9.26100示例 3:输入: 2.00000, -2输出: 0.25000解释: 2-2 = 1/22 =原创 2020-07-27 16:11:24 · 210 阅读 · 0 评论 -
高效求a的n次幂
代码实现 private static int pow(int a, int n) { if (n == 0) return 1; int res = a;//复制a int ex = 1;//令指数为1 //能翻 while ((ex << 1) <= n) {//如果指数翻倍后小于目标指数值 //翻 res = res * res; //指数 ex <<= 1;//指数能翻,那就翻原创 2020-07-27 11:08:38 · 282 阅读 · 0 评论 -
compareto方法的详细介绍+求字符串索引
文章目录1.题目描述2. 代码实现3.java中的compareto方法的详细介绍1.题目描述有个排序后的字符串数组,其中散布着一些空字符串,编写一个方法,找出给定字符串(肯定不是空字符串)的索引。2. 代码实现public class Demo1 { public static void main(String[] args) { String[] arr = { "a", "", "ac", "", "ad", "b", "", "ba" }; int res = indexOf原创 2020-07-27 10:49:44 · 208 阅读 · 0 评论 -
旋转数组的最小数字
文章目录题目描述思路分析代码实现题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。思路分析数组在一定程度上是排序的,很容易分析出:可以采用二分法来寻找最小数字。代码实现public class Demo { static int min(int[] arr) { int begin = 0; i原创 2020-07-27 10:04:47 · 107 阅读 · 0 评论 -
Leetcode112:路径总和
文章目录题目描述思路分析代码实现题目描述思路分析求解从 root 到叶子节点是否存在路径和为 sum 的路径 hasPathSum(root, sum)。可以转换成求解从 root.left 或者 root.right 到叶子节点是否存在路径和为 sum - root.val 的路径,即 hasPathSum(root.left, sum - root.val) || hasPathSum(root.right, sum - root.val) 。代码实现class TreeNode{原创 2020-07-08 11:10:04 · 89 阅读 · 0 评论 -
面试题16.11:跳水板
文章目录题目描述思路分析代码实现题目描述思路分析这道题有两种情况(1)长木板和短木板长度相同,此时就只有一种结果(2)当两者长度不同时,先使用三块短木板,之后每次都用一块长木板替换,这样肯定长度会越来越长,也就满足了从小到大顺序输出。代码实现 public int[] divingBoard(int shorter, int longer, int k) { if (k == 0) { return new int[0]; } int[] result = new int[原创 2020-07-08 09:14:18 · 118 阅读 · 0 评论 -
Leetcode44:通配符匹配(附视频解析)
文章目录题目描述代码实现(建议背下来)题目描述给定一个字符串(s)和一个字符模式 (p),实现一个支持 ‘?’ 和 ‘*’ 的通配符匹配。‘?’ 可以匹配任何单个字符。‘*’ 可以匹配任意字符串(包括空字符串)。两个字符串完全匹配才算匹配成功。说明:s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。示例 1:输入:s = "aa"p = "a"输出: false解释: "a" 无法匹配 "aa" 整个字符串。原创 2020-07-05 16:11:18 · 130 阅读 · 0 评论