![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
薛畅畅
好好学技术
展开
-
动态规划之使用最小花费爬楼梯
数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯。请你找出达到楼层顶部的最低花费。在开始时,你可以选择从下标为 0 或 1 的元素作为初始阶梯。示例 1:输入:cost = [10, 15, 20]输出:15解释:最低花费是从 cost[1] 开始,然后走两步即可到阶梯顶,一共花费 15 。示例 2:输入:cost = [1,原创 2021-05-24 21:48:48 · 276 阅读 · 3 评论 -
动态规划之计算各个位数不同的数字个数
给定一个非负整数 n,计算各位数字都不同的数字 x 的个数,其中 0 ≤ x < 10的n次方。示例:输入: 2输出: 91解释: 答案应为除去 11,22,33,44,55,66,77,88,99 外,在 [0,100) 区间内的所有数字。代码: public int countNumbersWithUniqueDigits(int n) { if(n==0) return 1; if(n==1) return原创 2021-05-23 22:00:46 · 285 阅读 · 0 评论 -
动态规划之整数拆分
给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。示例 1:输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1。示例 2:输入: 10输出: 36解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。代码: public int integerBreak(int n) { int[] dp=new int[n+1]; for(int i=2;i<=n;i++)原创 2021-05-23 21:23:30 · 233 阅读 · 0 评论 -
动态规划之解码方法
一条包含字母 A-Z 的消息通过以下映射进行了编码 :‘A’ -> 1‘B’ -> 2…‘Z’ -> 26要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,“11106” 可以映射为:“AAJF” ,将消息分组为 (1 1 10 6)“KJF” ,将消息分组为 (11 10 6)注意,消息不能分组为 (1 11 06) ,因为 “06” 不能映射为 “F” ,这是由于 “6” 和 “06” 在映射中并不等价。给你一个只含数字原创 2021-05-21 21:22:13 · 107 阅读 · 0 评论 -
动态规划之乘积最大子数组
给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。示例 1:输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6。示例 2:输入: [-2,0,-1]输出: 0解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。代码: public static int maxProduct(int[] nums) { int max=Integer.MIN_VALUE,imax=1原创 2021-05-21 15:02:45 · 45 阅读 · 0 评论 -
动态规划之最大正方形
在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内,找到只包含 ‘1’ 的最大正方形,并返回其面积。示例:代码:public int maximalSquare(char[][] matrix) { int m=matrix.length,n=matrix[0].length; int min=0; int[][]dp=new int[m][n]; for(int i=0;i<m;i++) for(int j=0;j<n;j++原创 2021-05-17 14:57:07 · 99 阅读 · 1 评论 -
动态规划之不同的子序列
给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。字符串的一个 子序列 是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,“ACE” 是 “ABCDE” 的一个子序列,而 “AEC” 不是)题目数据保证答案符合 32 位带符号整数范围。示例 :输入:s = “rabbbit”, t = “rabbit”输出:3解释:如下图所示, 有 3 种可以从 s 中得到 “rabbit” 的方案。(上箭头符号 ^ 表示选取的字母)ra原创 2021-05-15 11:07:39 · 86 阅读 · 0 评论 -
动态规划之打家劫舍||
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。示例 :代码:public int rob(int[] nums) { if(nums.length==1) return n原创 2021-05-14 22:26:27 · 108 阅读 · 1 评论 -
动态规划之交错字符串
给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串:s = s1 + s2 + … + snt = t1 + t2 + … + tm|n - m| <= 1交错 是 s1 + t1 + s2 + t2 + s3 + t3 + … 或者 t1 + s1 + t2 + s2 + t3 + s3 + …提示:a + b 意味着字符串 a 和 b 连接。示例1原创 2021-05-14 21:16:50 · 96 阅读 · 0 评论 -
动态规划之打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例 :输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。代码:public int rob(原创 2021-05-10 10:09:41 · 73 阅读 · 0 评论 -
动态规划之三角形最小路径和
给定一个三角形 triangle ,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。示例 1:输入:triangle = [[2],[3,4],[6,5,7],[4,1,8,3]]输出:11解释:如下面简图所示:23 46 5 74 1 8 3自顶向下的最小路径和为 11(即,原创 2021-05-10 09:55:17 · 74 阅读 · 0 评论 -
动态规划之最小路径和
给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例:代码: public int minPathSum(int[][] grid) { if(grid.length==0||grid[0].length==0) { return 0; } int rows=grid.length,columns=grid[0].length; int []原创 2021-05-08 21:46:21 · 88 阅读 · 0 评论 -
动态规划之不同路径 ||
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?网格中的障碍物和空位置分别用 1 和 0 来表示。示例:代码: public int uniquePathsWithObstacles(int[][] obstacleGrid) { int m=obstacleGrid.le原创 2021-05-08 21:41:07 · 85 阅读 · 0 评论 -
动态规划之不同路径
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?示例 1:...原创 2021-05-08 16:11:10 · 78 阅读 · 0 评论 -
动态规划之最长公共子串
计算两个字符串的最大公共字串的长度。公共子序列:在母串中都出现过并且出现顺序与母串保持一致。最长公共子序列:顾名思义,是指在所有的子序列中最长的那一个。子串:是要求更严格的一种子序列,要求在母串中连续地出现。代码: public static int f(String str1,String str2) { int len1=str1.length(); int len2=str2.length(); int result=0; int[][] dp原创 2021-05-08 11:11:57 · 105 阅读 · 0 评论 -
动态规划之最长公共子序列
给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。示例 1:输入:text1 = “abcde”, text2 = “ace”原创 2021-05-06 15:35:07 · 105 阅读 · 0 评论 -
动态规划之最大子序和
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例 1:输入:nums = [-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。示例 2:输入:nums = [1]输出:1示例 3:输入:nums = [0]输出:0示例 4:输入:nums = [-1]输出:-1示例 5:输入:nums = [-100000]输出:-100000 public int m原创 2021-05-05 15:39:35 · 85 阅读 · 0 评论 -
LeetCode 31下一个排列
实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须原地修改,只允许使用额外常数空间。示例 1:输入:nums = [1,2,3]输出:[1,3,2]示例 2:输入:nums = [3,2,1]输出:[1,2,3]示例 3:输入:nums = [1,1,5]输出:[1,5,1]示例 4:输入:nums = [1]输出:[1]代码: public void nextP原创 2021-05-05 15:02:57 · 51 阅读 · 0 评论 -
LeetCode22 括号生成
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。示例 1:输入:n = 3输出:["((()))","(()())","(())()","()(())","()()()"]示例 2:输入:n = 1输出:["()"]代码: public List<String> generateParenthesis(int n) { List<String>combinations=new ArrayList<S原创 2021-05-05 14:12:05 · 71 阅读 · 0 评论 -
LeetCode49 字母异位词分组
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。示例:输入: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]输出:[[“ate”,“eat”,“tea”],[“nat”,“tan”],[“bat”]]代码:public List<List<String>> groupAnagrams(String[] strs) { Map<String,List<String&g原创 2021-04-29 13:42:46 · 67 阅读 · 0 评论 -
LeetCode114 二叉树展开为链表
给你二叉树的根结点 root ,请你将它展开为一个单链表:展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。示例:代码:public void flatten(TreeNode root) { List<TreeNode>a=new ArrayList<TreeNode>(); f(root,a); for(int原创 2021-04-29 13:33:30 · 103 阅读 · 0 评论 -
反转链表
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL分析:定义一个指针prev=null,此时head在前,prev在后每次让head的next指向prev,实现一次局部的反转局部反转完成后,head和prev同时往前移动一个位置循环上述过程,直到head到达链表尾部代码: public ListNode re原创 2021-04-26 11:00:36 · 106 阅读 · 0 评论 -
前序、中序、后序遍历
1、树有很多种,每个节点最多只能有两个子节点的一种形式称为二叉树。2、二叉树的子节点分为左节点和右节点。3、前序遍历:先输出父节点,再遍历左子树和 右子树。4、中序遍历:先遍历左子树,再输出父节点,再遍历右子树。5、后序遍历:先遍历左子树,再遍历右子树,最后输出父节点。6、前序遍历代码:public List<Integer> postorderTraversal(TreeNode root) { List<Integer>res=new ArrayList<原创 2021-04-25 14:05:02 · 1180 阅读 · 0 评论 -
LeetCode 39 组合总和
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。示例 1:输入:candidates = [2,3,6,7], target = 7,所求解集为:[[7],[2,2,3]]示例 2:输入:candidates = [2,3,5], target = 8,所求原创 2021-04-25 13:07:31 · 41 阅读 · 0 评论 -
LeetCode 437 路径总和 |||
给定一个二叉树,它的每个结点都存放着一个整数值。找出路径和等于给定数值的路径总数。路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。示例:代码: public int pathSum(TreeNode root, int targetSum) { if(root==null) { return 0; }原创 2021-04-25 12:25:24 · 62 阅读 · 0 评论 -
LeetCode 113路径总和 ||
给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。示例:代码:public List<List<Integer>> pathSum(TreeNode root, int targetSum) { dfs(root,targetSum); return a; } public void dfs(TreeNode原创 2021-04-24 21:10:04 · 83 阅读 · 0 评论 -
LeetCode112 路径总和
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。叶子节点 是指没有子节点的节点。示例:代码:public boolean hasPathSum(TreeNode root, int sum) { if(root==null) return false; if(root.left==null&&root.right==nu原创 2021-04-24 11:44:36 · 61 阅读 · 0 评论 -
LeetCode 46 组合算法
LeetCode 46给定一个 没有重复 数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]题解:public static List<List<Integer>>permute(int[] nums) { List<List<Integer>>res=new ArrayList<List&l原创 2021-04-24 11:19:59 · 97 阅读 · 0 评论 -
排序算法
1、排序也称排序算法,排序是将一组数据,依指定的顺序进行排列的过程。2、排序的分类:冒泡排序、选择排序、插入排序3、冒泡排序 public static void bubbleSort(int[] arr) { for(int i=0;i<arr.length-1;i++) for(int j=i+1;j<arr.length;j++) { if(arr[i]>arr[j]) { int t=原创 2021-04-23 15:34:17 · 87 阅读 · 0 评论