算法问题
文章平均质量分 86
随性而活的风
这个作者很懒,什么都没留下…
展开
-
删除排序数组的重复项问题
删除排序数组的重复项问题I , II删除排序数组的重复项问题I问题描述思路分析代码实现public static void main(String[] args) { int[] nums = {0,0,1,1,1,2,2,3,3,4}; RemoveDuplicates solution = new RemoveDuplicates(); int count = solution.removeDuplicates(nums);原创 2020-10-28 16:38:28 · 233 阅读 · 0 评论 -
算法题之重构乘积数组问题
算法题之重构乘积数组问题问题描述思路分析res[i]中在两次遍历过程中乘积的元素变化图为:代码实现//思路.左右相间相乘法 public int[] constructArr02(int[] a) { int n = a.length; if (a == null || n == 0) return new int[0]; //定义一个新的结果集res int[] res = new int[n]; //原创 2020-10-18 13:20:20 · 173 阅读 · 0 评论 -
华为面试题计算求和的最短时间问题
华为面试题计算求和的最短时间问题问题描述问题分析图解我们以nums = {5,4,1,2,2}这5个数为例代码实现 public static void main(String[] args) { //编写输入案例:n为计算数的个数;n个数用队列queue接收(此处队列用添加有序的LinkedList定义) Scanner scanner = new Scanner(System.in); System.out.println("请输入要输入原创 2020-10-16 12:20:17 · 1168 阅读 · 1 评论 -
算法题之字符串相乘问题
算法题之字符串相乘问题问题描述题解图解1图解2代码实现 public String multiply(String num1, String num2) { //首先我们去除掉特殊情况 //如果num1和num2长度为0或者num1和num2为"0",则返回0 if (num1.length() == 0 || num2.length() == 0 || num1.equals("0") || num2.equals("0")) retur原创 2020-10-15 12:53:36 · 295 阅读 · 1 评论 -
算法题之分割等和子集问题
算法题之分割等和子集问题问题描述问题分析代码实现//利用动态规划完成问题的求解(二维动态规划数组完成) public boolean canPartition(int[] nums) { //首先我们需要判断nums数组的长度是否 > 1 if (nums.length < 2) return false; //进行求nums数组所有正整数的和 int sum = 0; for (int num原创 2020-10-12 21:39:47 · 440 阅读 · 0 评论 -
算法题之最长有效括号的长度问题
算法题之最长有效括号的长度问题问题描述思路分析代码实现public int longestValidParentheses(String s) { if (s == null || s.length() <= 1) { return 0; } //定义一个栈 Stack<Integer> stack = new Stack<>(); int len = s.len原创 2020-10-12 11:00:58 · 533 阅读 · 0 评论 -
算法题之环形链表问题
算法题之环形链表问题环形链表问题1思路1:利用快慢指针来实现分析:我们定义两个指针:分别指向头节点和头节点的下一个节点;每一次慢指针平移一步(即平移到它的next节点),而快指针则平移两步(即平移到它的next的next节点),完成快指针追赶慢指针的操作;如果该链表时环形链表,则一定会在某一个时间点,快指针会和慢指针在环内相遇代码实现/* * 环形链表I:方法1:使用两个指针(快慢指针)来完成环形链表的是否有环判断问题 * 即定义一个指针first和指针second同时指向原创 2020-10-10 19:31:03 · 212 阅读 · 0 评论 -
算法题之合并两个有序单向链表
算法题之合并两个有序单向链表题目描述题目分析代码实现思路1代码:public ListNode mergeTwoLists(ListNode l1, ListNode l2) { //首先判断两个头结点是否都为null,如果均为null则直接返回null即可 if (l1 == null && l2 == null) { return null; } //定义一个新的链表头节点:仅仅表示一原创 2020-10-07 20:58:37 · 660 阅读 · 0 评论 -
算法题之有效括号问题
算法题之有效括号问题题目描述思路分析思路图解代码实现 public boolean isValid(String s) { //首先对s进行判断:(1)若s为空或者null,则表示有效字符串(2)若s的长度为奇数,则不可能满足要求,直接返回false if (s == null || s.length() == 0) return true; if (s.length() % 2 == 1) return false; //首先原创 2020-10-07 12:29:58 · 304 阅读 · 0 评论 -
算法题之颜色分类问题(O(n)时间复杂度)
算法题之颜色分类问题(O(n)时间复杂度)题目描述思路分析思路一图解思路2图解代码实现 //思路2:双指针操作 public void sortColors(int[] nums) { //定义两个指针:left指向数组起始索引,right指向数组末尾索引 int left = 0; int right = nums.length - 1; //for循环遍历nums数组 for (int i =原创 2020-10-07 12:26:55 · 256 阅读 · 0 评论 -
算法题之电话号码的字母组合问题
算法题之电话号码的字母组合问题题目描述思路分析图解代码实现public List<String> letterCombinations(String digits) { //定义res:存储最终字母组合的结果集 List<String> res = new ArrayList<>(); //如果传入的digits为null或者长度为0,则直接返回空的res if (digits == null原创 2020-10-06 10:48:04 · 332 阅读 · 0 评论 -
算法题之最接近的三数之和问题
算法题之最接近的三数之和问题题目描述题目分析图解以上面给的示例为例:代码实现 public int threeSumClosest(int[] nums, int target) { //定义一个存储每一次三个数组合的和 int res = 0; //若nums为null或者长度小于3,直接返回0 if (nums == null || nums.length < 3) { return res;原创 2020-10-06 10:45:11 · 226 阅读 · 0 评论 -
算法题之四数之和问题求解
算法题之四数之和问题求解问题描述思路分析代码实现[思路图解可以参考直接博客三数之和问题]算法题之三数之和问题 public List<List<Integer>> fourSum(int[] nums, int target) { List<List<Integer>> res = new ArrayList<>(); //首先对该数组进行排序处理 Arrays.sort(nums);原创 2020-10-05 15:48:50 · 290 阅读 · 0 评论 -
算法题之机器人运动范围问题
算法题之机器人运动范围问题问题描述思路分析思路1:使用递归回溯法进行求解代码实现 int moveCount; public int movingCount(int m, int n, int k) { //构造m行n列的二维数组: int[][] board = new int[m][n]; findMovingPath(0,0,m,n,board,k); return moveCount; } priv原创 2020-10-05 10:52:07 · 467 阅读 · 0 评论 -
算法题之三数之和问题
算法题之三数之和问题题目描述题目分析方式2:图解最后得到结果集:java代码方式1:dfs遍历public List<List<Integer>> threeSum(int[] nums) { //首先对nums数组进行排序处理 Arrays.sort(nums); //保存所有的结果集:res List<List<Integer>> res = new ArrayLi原创 2020-10-04 18:12:51 · 1467 阅读 · 0 评论 -
算法题之罗马数字转成整数
算法题之罗马数字转成整数问题描述将罗马数字转整数罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 X原创 2020-10-03 15:37:27 · 269 阅读 · 0 评论 -
算法题之将整数转换成罗马数字
算法题之将整数转换成罗马数字题目描述罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即原创 2020-10-03 11:28:08 · 590 阅读 · 0 评论 -
算法题之填充每个节点的下一个右侧节点指针 II
算法题之填充每个节点的下一个右侧节点指针 II题目描述题解java代码public class FillUpRightNode { /* *给定一个二叉树:填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。 * 输入:root = [1,2,3,4,5,null,7] * 输出:[1,#,2,3,#,4,5,7,#] * */ public static void mai原创 2020-09-30 16:42:31 · 153 阅读 · 0 评论 -
算法题之求基数x的n次方
算法题之求基数x的n次方题目描述题目分析我们先来看两个例子:代码实现//利用递归和二分法进行计算 public double myPow(double x,int n) { if (n == 0) { return 1; } //如果n为负数:则将其改为负数,并将1/x提取出一个 if (n < 0) { //由于n若为Integer.MIN_VALUE,即-2^3原创 2020-09-28 19:55:24 · 703 阅读 · 0 评论 -
算法题之求所有从根节点到叶子节点路径总和等于给定目标和的路径问题
算法题之求所有从根节点到叶子节点路径总和等于给定目标和的路径问题题目描述思路图解代码实现方式1 public List<List<Integer>> pathSum(TreeNode root, int sum) { //定义存储最后结果的list集合 List<List<Integer>> res = new ArrayList<>(); //定义sub存储每一次满足要求的结果集原创 2020-09-28 19:04:38 · 940 阅读 · 0 评论 -
算法题之中序后序构建二叉树(以及前序中序构建二叉树)
算法题之中序后序构建二叉树(以及前序中序构建二叉树)题目描述中序与后序遍历构建二叉树思路分析代码实现public class FindBinaryTreeByInfixAndPost { //定义两个中序数组和后序数组属性 int[] inorder; int[] postorder; //定义属性post_idx记录每一 次的根结点位置 int post_idx; //定义一个hashmap:存储中序遍历结果 HashMap<Int原创 2020-09-25 16:36:12 · 248 阅读 · 1 评论 -
算法题之字符串的Z字变换
算法题之字符串的Z字变换题目描述题解代码实现import java.util.ArrayList;import java.util.List;public class ZWordExchange { /* * 将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。 * 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时, * 排列如下: * L C I R * E T O E S I原创 2020-09-25 09:59:41 · 212 阅读 · 0 评论 -
算法题之求字符串的最长回文子串(中间扩散法,动态规划)
算法题之求字符串的最长回文子串(中间扩散法,动态规划)题目描述回文串:是一个正读和反读都一样的字符串给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: “babad”输出: “bab”注意: “aba” 也是一个有效答案。示例 2:输入: “cbbd”输出: “bb”题解1:中间扩散法代码实现public String longestPalindromeByMidEx(String s) { //如果s长度为0原创 2020-09-23 14:54:55 · 422 阅读 · 0 评论 -
算法题之监控二叉树问题
算法题之监控二叉树问题问题描述给定一个二叉树,我们在树的节点上安装摄像头。节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。计算监控树的所有节点所需的最小摄像头数量。示例 1:输入:[0,0,null,0,0]输出:1解释:如图所示,一台摄像头足以监控所有节点。示例 2:输入:[0,0,null,0,null,0,null,null,0]输出:2解释:需要至少两个摄像头来监视树的所有节点。 上图显示了摄像头放置的有效位置之一。题解代码实现package com.原创 2020-09-22 16:38:33 · 166 阅读 · 0 评论 -
算法题之求最大不重复子串的个数(滑动窗口)
算法题之求最大不重复子串的个数(滑动窗口)题目描述给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: “pwwkpw”输出: 3解释: 因为无重复字符的最长子串是 “kpw”,所以其长度为 3。题解(滑动窗口)以输入: "pwwkp原创 2020-09-22 10:04:48 · 1978 阅读 · 3 评论 -
算法题之求子集问题
算法题之求子集问题题目描述给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。输入: nums = [1,2,3] 输出:[[3],[1],[2],[1,2,3],[1,3],[2,3],[1,2],[]]题解代码实现package com.bingym.algorithm.recursionproblems.subset;import java.util.ArrayList;import java.util.Arrays;impo原创 2020-09-21 10:03:51 · 629 阅读 · 0 评论 -
递归回溯问题总结(迷宫问题,匹配路线问题,王子找公主问题)
递归回溯问题总结(迷宫问题,匹配路线问题,王子找公主问题)递归回溯问题回溯法概述:用回溯法解决的问题的所有选项可以形象的用树状图结构进行描述,在某一步有n个可能的选项.那么该步骤可以看成是树状结构中的一个节点,每个选项看成树中节点连接连接线,经过这些连接线到达该节点的n个子节点,树的叶节点对应着终结状态.如果在叶节点的状态满足题目中的约束条件,那么我们即找到了一个可行的解决方案;如果叶节点的状态不满足约束条件,只能回溯到上一个节点再继续尝试其他的选项,如果上一个节点的所有可能的选项都已经试过,并且不原创 2020-09-20 19:17:13 · 450 阅读 · 0 评论 -
算法题之输出字符串的数字
算法题之输出字符串的数字题目描述请你来实现一个 atoi 函数,使其能将字符串转换成整数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响。注意:假如该字符串中原创 2020-09-19 16:26:31 · 2274 阅读 · 0 评论 -
算法题值秋叶集问题(动态规划实现)
算法题值秋叶集问题(动态规划实现)题目描述小扣出去秋游,途中收集了一些红叶和黄叶,他利用这些叶子初步整理了一份秋叶收藏集 leaves, 字符串 leaves 仅包含小写字符 r 和 y, 其中字符 r 表示一片红叶,字符 y 表示一片黄叶。出于美观整齐的考虑,小扣想要将收藏集中树叶的排列调整成「红、黄、红」三部分。每部分树叶数量可以不相等,但均需大于等于 1。每次调整操作,小扣可以将一片红叶替换成黄叶或者将一片黄叶替换成红叶。请问小扣最少需要多少次调整操作才能将秋叶收藏集调整完毕。示例 1:输入原创 2020-09-17 18:55:47 · 277 阅读 · 0 评论 -
算法题之两数之和(链表实现)
算法题之两数之和(链表实现)题目描述给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807思路分析由于思路1不能完成最原创 2020-09-17 10:55:29 · 499 阅读 · 0 评论 -
算法题之二叉排序树的翻转(递归实现)
算法题之二叉排序树的翻转(递归实现)题目描述题目分析题解思路:从头结点遍历整颗二叉树:若当前节点为null:表示已经到达叶子节点的下一个节点,直接返回若当前节点的左子树不为空:则递归进行左子树的翻转操作若当前节点的右子树不为空:则递归进行右子树的翻转操作最后,对当前节点进行翻转操作:首先定义一个辅助节点变量temp = this.left;然后将当前节点的左子树等于当前节点的右子树:this.left = this.right;最后将当前节点的右子树等于当前节点的左子树:this.r原创 2020-09-16 17:21:08 · 356 阅读 · 0 评论 -
算法题之判断数独是否有效问题
算法题之判断数独是否有效问题题目描述判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。上图是一个部分填充的有效的数独。数独部分空格内已填入了数字,空白格用 ‘.’ 表示。示例 1:输入:[[“5”,“3”,".",".",“7”,".",".",".","."],[“6”,".",".",“1”,“9”,“5”,".",".原创 2020-09-15 16:57:08 · 1113 阅读 · 0 评论 -
算法问题之酒店预订问题(动态规划)
酒店预订问题(动态规划)题目描述你要出去旅游,有N元的预算住酒店,有M家酒店供你挑选,这些酒店都有价格X。需要你正好花完这N元住酒店(不能多,也不能少)最少能住几晚?返回最少住的天数,没有匹配的返回-1比如你有1000元,所有酒店都是大于1000的,则返回-1比如你有1000元,有1家1000元的,有1家300,有1家700。则最少能住1晚,最多住2晚(300+700)。返回1比如你有1000元,有1家387元,有1家2元,有一家611,则返回3(3家各住1天)比如你有1000元,有1家1元的原创 2020-09-15 08:33:03 · 1885 阅读 · 0 评论 -
m位非负整数N去掉X位数的剩下位数最小值(java代码)
m位非负整数N去掉X位数的剩下位数最小值题设给定一个用字符串表示的m位非负整数N,去掉其中的x位数以后,使得剩下的数字Y最小:注意:m>=xN不会包含前导零,即首位一定是非0数字输入:第一行:字符窗数字a第二行:x示例:输入:14323193输出:1219题目分析:该题依旧属于递归回溯问题问题分析第一次我们选择的第一个数将其加入集合中,然后递归选择第2个,第3个…直到集合的size等于我们去掉X个数以后剩余K位数的K,此时我们需要对其进行判断:(1)如果此时我们集合中原创 2020-09-14 18:52:25 · 1147 阅读 · 0 评论 -
组合求和问题(java实现)
组合求和问题(java实现)题设题目分析举例图解java代码实现package com.bingym.algorithm.mergenum;import java.util.ArrayList;import java.util.Arrays;import java.util.List;public class MergeNumDemo { static int num[] = {0,1,2,3,4,5,6,7,8,9}; public static void ma原创 2020-09-12 13:07:39 · 519 阅读 · 0 评论 -
Floyd算法解决最小路径问题(Java代码实现)
Floyd算法解决最小路径问题(Java代码实现)Floyd算法问题1代码实现package com.bingym.floyd;public class FloydAlgorithmDemo2 { /* * K:1~6[表示访问的中间顶点] * i:1~6[表示访问的起始顶点] * J:1~6[表示访问的终点顶点] * 计算出每一个顶点作为起始顶点,到达其他顶点的最短路径 * 举例:k=2,i=1,j从1~6:第一轮即计算出以1顶点为起始顶原创 2020-09-05 10:52:14 · 551 阅读 · 0 评论 -
Dijkstra算法求解最短路径问题(java代码实现)
Dijkstra算法求解最短路径问题(java代码实现)java代码实现package com.bingym.dijkstra;import java.util.Arrays;public class DijkstraAlgorithmNoDirectedGraph { /* * 利用Dijkstra算法求解最短路径问题 * 此时为无向图,顶点分别为:'A', 'B', 'C', 'D', 'E', 'F', 'G'七个顶点 * 求解每个顶点到其原创 2020-09-05 08:52:17 · 1068 阅读 · 3 评论 -
Kruskal算法求解最小生成树问题(java代码实现)
Kruskal算法求解最小生成树问题(java代码实现)Kruskal算法求解上面的公交问题(即求解该图的最小生成树)的思路分析在含有n个顶点的连通图中选择n-1条边,构成一棵极小连通子图,并使该连通子图中n-1条边上权值之和达到最小,则称其为连通网的最小生成树。例如,对于如上图所示的连通网可以有多棵权值总和不相同的生成树。以上图为例,来对克鲁斯卡尔进行演示(假设,用数组R保存最小生成树结果)。图解分析文字描述:第1步:将边<E,F>加入R中。边<E,F>的原创 2020-09-04 14:06:21 · 1297 阅读 · 0 评论 -
普利姆算法(Prim)解决修路问题
普利姆算法(Prim)解决修路问题普利姆算法应用当前问题得到的最小生成树思路图解:java代码package com.bingym.prim;import java.util.Arrays;public class PrimAlgorithm { /* * 普利姆算法: * 典型的修路问题: * 1)有胜利乡有7个村庄(A, B, C, D, E, F, G) ,现在需要修路把7个村庄连通 * 2)各个村庄的距离用边线表示(权) ,比如 A –原创 2020-09-03 21:40:19 · 704 阅读 · 0 评论 -
贪心算法(电台覆盖问题实现)
贪心算法(电台覆盖问题实现)贪心算法(1)贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法(2)贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果贪心算法问题:电台覆盖问题贪心算法求解思路第一步:第二步:第三步:第四步:第五步:java代码实现package com.bingym.greedy;import java.util.*;原创 2020-09-03 17:12:16 · 687 阅读 · 0 评论