算法
文章平均质量分 57
记录自己的算法学习之路。
Alfred_XiaJL
路虽远,行则将至;事虽难,做则必成。
展开
-
Java实现十大经典排序算法之快速排序
快速排序是一种高效率排序算法,它是对冒泡排序的一种改进,它也是一种。在待排序数组中指定一个基准元素pivot(一般选取数组首元素),使得数组排序之后基准元素左边的所有元素均小于它,右边的元素均大于它,重复以上过程递归地对左右子集合进行排序。平均时间复杂度,最坏时间复杂度为O(n2)原创 2023-08-04 19:22:58 · 1114 阅读 · 1 评论 -
Java实现十大经典排序算法之选择排序
选择排序是一种不稳定的排序算法,时间复杂度为O(n2)。其算法原理是首先在未排序的序列中找到最小(最大)的元素,将其交换到排序序列的起始位置,接着继续从剩下的为排序序列中中找到最小(最大)的元素,将其交换到已排序的序列末尾。重复以上过程,直到所有元素均排序完成。原创 2023-05-15 16:22:39 · 142 阅读 · 1 评论 -
力扣Top100题之两数相加(Java解法)
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例 1:输入:l1 = [2,4,3], l2 = [5,6,4]输出:[7,0,8]解释:342 + 465 = 807.原创 2023-02-27 20:57:56 · 898 阅读 · 0 评论 -
LeetCode70. 爬楼梯(Java解法——使用完全背包求解)
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?示例 1:输入:n = 2输出:2解释:有两种方法可以爬到楼顶。示例 2:输入:n = 3输出:3解释:有三种方法可以爬到楼顶。3. 1 阶 + 1 阶 + 1 阶4. 1 阶 + 2 阶5. 2 阶 + 1 阶。原创 2023-01-06 10:57:55 · 263 阅读 · 0 评论 -
LeetCode62. 不同路径(java解法——动态规划)
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?示例 1:输入:m = 3, n = 7输出:28示例 2:输入:m = 3, n = 2输出:3解释:从左上角开始,总共有 3 条路径可以到达右下角。示例 3:输入:m = 7, n = 3输出:28示例 4:输入:m = 3, n = 3。原创 2022-12-15 10:35:38 · 961 阅读 · 0 评论 -
LeetCode56. 合并区间(Java贪心解法)
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi]。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。原创 2022-12-01 21:38:25 · 493 阅读 · 0 评论 -
LeetCode435. 无重叠区间
给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi]。返回 需要移除区间的最小数量,使剩余区间互不重叠。示例 1:输入: intervals = [[1,2],[2,3],[3,4],[1,3]]输出: 1解释: 移除 [1,3] 后,剩下的区间没有重叠。示例 2:输入: intervals = [ [1,2], [1,2], [1,2] ]输出: 2解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。原创 2022-11-30 21:29:22 · 270 阅读 · 0 评论 -
LeetCode135. 分发糖果(贪心算法)
n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目。原创 2022-11-24 20:45:05 · 901 阅读 · 0 评论 -
LeetCode1005. K 次取反后最大化的数组和
给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:选择某个下标 i 并将 nums[i] 替换为 -nums[i]。重复这个过程恰好 k 次。可以多次选择同一个下标 i。以这种方式修改数组后,返回数组 可能的最大和。示例 1:输入:nums = [4,2,3], k = 1输出:5解释:选择下标 1 ,nums 变为 [4,-2,3]。示例 2:输入:nums = [3,-1,0,2], k = 3输出:6。原创 2022-11-22 22:17:01 · 553 阅读 · 0 评论 -
LeetCode53. 最大子数组和(贪心算法)
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组 是数组中的一个连续部分。示例 1:输入:nums = [-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组 [4,-1,2,1] 的和最大,为 6。示例 2:输入:nums = [1]输出:1示例 3:输入:nums = [5,4,-1,7,8]输出:23。原创 2022-11-14 11:52:10 · 695 阅读 · 0 评论 -
LeetCode46. 全排列(Java)
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列。你可以 按任意顺序 返回答案。示例 1:输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2:输入:nums = [0,1]输出:[[0,1],[1,0]]示例 3:输入:nums = [1]输出:[[1]]来源:力扣(LeetCode)原创 2022-11-02 15:08:47 · 260 阅读 · 0 评论 -
LeetCode90. 子集 II
给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。示例 1:输入:nums = [1,2,2]输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]示例 2:输入:nums = [0]输出:[[],[0]]提示:来源:力扣(LeetCode)原创 2022-10-31 20:08:26 · 197 阅读 · 0 评论 -
LeetCode108. 将有序数组转换为二叉搜索树
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。示例 1:输入:nums = [-10,-3,0,5,9]输出:[0,-3,9,-10,null,5]解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:示例 2:输入:nums = [1,3]输出:[3,1]原创 2022-10-18 15:35:31 · 229 阅读 · 0 评论 -
LeetCode450. 删除二叉搜索树中的节点
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点可分为两个步骤:首先找到需要删除的节点;如果找到了,删除它。示例 1:输入:root = [5,3,6,2,4,null,7], key = 3输出:[5,4,6,2,null,null,7]解释:给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。原创 2022-10-13 15:33:13 · 104 阅读 · 0 评论 -
LeetCode701. 二叉搜索树中的插入操作
给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。返回插入后二叉搜索树的根节点。输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。你可以返回 任意有效的结果。原创 2022-10-11 14:37:48 · 112 阅读 · 0 评论 -
LeetCode98. 验证二叉搜索树
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下:节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例 1:输入:root = [2,1,3]输出:true示例 2:输入:root = [5,1,4,null,null,3,6]输出:false解释:根节点的值是 5 ,但是右子节点的值是 4。来源:力扣(LeetCode)原创 2022-10-06 15:53:34 · 264 阅读 · 0 评论 -
LeetCode700. 二叉搜索树中的搜索
给定二叉搜索树(BST)的根节点 root 和一个整数值 val。你需要在 BST 中找到节点值等于 val 的节点。返回以该节点为根的子树。如果节点不存在,则返回 null。示例 1:输入:root = [4,2,7,1,3], val = 2输出:[2,1,3]示例 2:输入:root = [4,2,7,1,3], val = 5输出:[]来源:力扣(LeetCode)原创 2022-10-06 14:48:37 · 169 阅读 · 0 评论 -
LeetCode617. 合并二叉树
给你两棵二叉树: root1 和 root2。想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。返回合并后的二叉树。注意: 合并过程必须从两个树的根节点开始。示例 1:输入:root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7]原创 2022-10-06 09:06:19 · 185 阅读 · 0 评论 -
LeetCode513. 找树左下角的值
给定一个二叉树的根节点 root,请找出该二叉树的最底层最左边节点的值。假设二叉树中至少有一个节点。示例 1:输入: root = [2,1,3]输出: 1示例 2:输入: [1,2,3,4,null,5,6,null,null,7]输出: 7来源:力扣(LeetCode)原创 2022-10-02 15:36:15 · 276 阅读 · 0 评论 -
LeetCode257. 二叉树的所有路径
给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。叶子节点 是指没有子节点的节点。示例 1:输入:root = [1,2,3,null,5]输出:[“1->2->5”,“1->3”]示例 2:输入:root = [1]输出:[“1”]来源:力扣(LeetCode)原创 2022-09-28 16:37:01 · 53 阅读 · 0 评论 -
LeetCode110. 平衡二叉树
给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例 1:输入:root = [3,9,20,null,null,15,7]输出:true示例 2:输入:root = [1,2,2,3,3,null,null,4,4]输出:false示例 3:输入:root = []输出:true来源:力扣(LeetCode)原创 2022-09-27 15:14:17 · 321 阅读 · 0 评论 -
LeetCode222. 完全二叉树的节点个数
给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。示例 1:输入:root = [1,2,3,4,5,6]输出:6示例 2:输入:root = []输出:0示例 3:输入:root = [1]输出:1来源:力扣(LeetCode)原创 2022-09-26 21:42:16 · 236 阅读 · 0 评论 -
LeetCode104. 二叉树的最大深度和N叉树的最大深度
给定一个二叉树(N叉树),找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7],返回它的最大深度 3。来源:力扣(LeetCode)原创 2022-09-25 14:54:09 · 325 阅读 · 0 评论 -
LeetCode226. 翻转二叉树
给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。示例 1:输入:root = [4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例 2:输入:root = [2,1,3]输出:[2,3,1]示例 3:输入:root = []输出:[]来源:力扣(LeetCode)原创 2022-09-24 15:34:28 · 188 阅读 · 0 评论 -
LeetCode429. N 叉树的层序遍历
给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。示例 1:输入:root = [1,null,3,2,4,null,5,6]输出:[[1],[3,2,4],[5,6]]示例 2:输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]原创 2022-09-24 14:45:20 · 126 阅读 · 0 评论 -
LeetCode102. 二叉树的层序遍历
给你二叉树的根节点 root ,返回其节点值的 层序遍历。(即逐层地,从左到右访问所有节点)。示例 1:输入:root = [3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]示例 2:输入:root = [1]输出:[[1]]示例 3:输入:root = []输出:[]来源:力扣(LeetCode)原创 2022-09-23 16:51:11 · 361 阅读 · 0 评论 -
Java数据结构之二叉树的基本操作
二叉树的基本操作原创 2022-09-23 15:29:35 · 381 阅读 · 0 评论 -
LeetCode347. 前 K 个高频元素
public Set entrySet(): 获取到Map集合中所有的键值对对象的集合(Set集合)。就是返回一个集合,集合里存放的是对象,创建对象的类有两个属性,分别是 键和值 也即键值对。其中Entry是属于Map的静态内部类,在创建Map对象的时候就会同时创建一个Entry对象,用来记录键与值的映射关系。原创 2022-09-22 14:38:03 · 153 阅读 · 0 评论 -
LeetCode239. 滑动窗口最大值
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回 滑动窗口中的最大值。原创 2022-09-21 16:05:17 · 243 阅读 · 0 评论 -
LeetCode150. 逆波兰表达式求值
根据逆波兰表示法,求表达式的值。有效的算符包括 +、-、*、/。每个运算对象可以是整数,也可以是另一个逆波兰表达式。注意 两个整数之间的除法只保留整数部分。可以保证给定的逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。原创 2022-09-20 15:20:52 · 337 阅读 · 0 评论 -
LeetCode1047. 删除字符串中的所有相邻重复项
给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。在 S 上反复执行重复项删除操作,直到无法继续删除。原创 2022-09-19 22:07:41 · 301 阅读 · 0 评论 -
LeetCode 20.有效的括号
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。来源:力扣(LeetCode)示例 1:输入:s = “()”输出:true示例 2:输入:s = “()[]{}”输出:true示例 3:输入:s = “(]”输出:false。原创 2022-09-18 19:04:09 · 318 阅读 · 0 评论 -
数组的二分查找法(折半查找)
有序数组的二分查找。力扣:在排序数组中查找元素的第一个和最后一个位置。原创 2022-07-07 19:49:14 · 662 阅读 · 0 评论 -
【蓝桥杯】
资源限制时间限制:1.0s 内存限制:512.0MB问题描述 输入一个正整数n,输出n!的值。 其中n!=123*…*n。算法描述 n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。 将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。 首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。输入格式 输入包含一个正整数n,n<=1原创 2022-03-09 15:18:41 · 92 阅读 · 0 评论 -
调整数组顺序使奇数位位于偶数前面(Java解法)
1.题目描述调整数组顺序使奇数位于偶数前面:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。要求时间复杂度为O(n)。2. 解题思路可以定义两个指针,一个指针指向数组的第一个元素,一个指针指向数组的最后的一个元素,然后分别移动收尾指针,当首指针指向数组中第一个偶数,尾指针指针指向第一个奇数时,两位置上的元素进行交换,直到首尾指针相等时,说明遍历完成。如图:3.程序代码public class test1 { /* 奇数在前 偶数在后*原创 2022-03-08 13:17:15 · 889 阅读 · 0 评论 -
力扣——截断句子
1.题目描述句子是一个单词列表,列表中的单词之间用单个空格隔开,且不存在前导或尾随空格。每个单词仅由大小写英文字母组成(不含标点符号)。例如,“Hello World”、“HELLO” 和 “hello world hello world” 都是句子。给你一个句子 s 和一个整数 k ,请你将 s 截断 ,使截断后的句子仅含 前 k 个单词。返回 截断 s 后得到的句子。来源:力扣(LeetCode)链接:https://leetcode原创 2021-12-06 14:58:48 · 252 阅读 · 0 评论 -
汉诺塔问题(递归求解)
问题描述汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?分析问题假设除了A最下面的盘子之外,其他的63个都移动到了B上,这时候把最下面的盘子由A移动到C即可。当最大的盘子由A移动到C,B上是是剩下的原创 2021-03-05 14:45:45 · 775 阅读 · 0 评论 -
计蒜客-练习题之矩阵旋转
题目:给出一个n*m的整数矩阵,请你把这个矩阵顺时针旋转90度以后输出。输入格式:第一行输入两个整数n,m中间用空格隔开,接下来n行每行m个整数 ,中间用空格隔开。(1=<n<=200, 1=<m<=200,矩阵中的数都在int范围内)**输出格式:**输出m行,每行n个整数中间用空格隔开。样例输入1:3 4-1 3 6 37 7 9 110 3 4 6样例输出2:10 7 -13 7 34 9 66 1 3代码:#include<stdio.h&原创 2021-03-03 22:32:27 · 867 阅读 · 1 评论 -
计蒜客-练习题之斐波那契数列
题目:相信小伙伴们都学过斐波那契数列,它是这样的一个数列:1,1,2,3,5,8,13,21⋯。用 fn表示斐波那契数列n项,则有:f1 = f2 = 1,fn = f{n-1} + f{n-2} (n>2)输入一个 n,求出 fn 对 1000000007(10^9+7)取模结果。输入格式输入一个整数 n(1≤n≤100000)。输出格式输入 fn mod 1000000007的值。样例输入3样例输出2代码:#include<stdio.h>int mai原创 2021-01-30 22:30:28 · 361 阅读 · 0 评论 -
会场安排问题(贪心算法)
会场安排问题(贪心算法)一、题目描述假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法进行安排。对于给定的k个待安排的活动,计算使用最少会场的时间表。输入第1行有1个正整数k,表示有k个待安排的活动。下来的k行中,每行有2个正整数,分别表示k个待安排的活动的开始时间和结束时间。时间以0点开始的分钟计。输出将计算出的最少会场数输出到。样例输入 Copy...原创 2019-12-16 22:04:11 · 11687 阅读 · 5 评论