Arithmetic
文章平均质量分 61
算法实战总结
纳兰青华
一个专注于写程序的疯子
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
N皇后问题:从入门到精通,一篇文章让你彻底搞懂!
本文深入解析N皇后问题的两种解法:朴素递归法和位运算优化法。N皇后问题要求在N×N棋盘上摆放N个互不攻击的皇后。解法一采用回溯思想,逐行放置皇后并检查合法性,时间复杂度为O(N!)。解法二利用位运算巧妙优化,通过三个位掩码(列限制、左右对角线限制)快速判断可放置位置,将空间复杂度降至O(1),时间效率显著提升。文章包含详细代码解析、数学原理说明和可视化示意图,特别适合算法学习者和面试备考者。对于4皇后问题,文中给出了具体的解示例和位运算参数图解,帮助读者直观理解这一经典回溯问题。原创 2026-07-22 00:16:37 · 251 阅读 · 0 评论 -
货币找零问题:动态规划的经典应用
货币找零问题的动态规划解法 货币找零问题是一个经典的动态规划应用,目标是用最少数量的货币组合出指定金额。问题描述为:给定货币面额数组arr和目标金额aim,求组成aim的最少货币数。 解法演进: 暴力递归:尝试所有组合,时间复杂度O(aim^N),存在大量重复计算。 记忆化搜索:通过缓存子问题结果优化,时间复杂度降为O(N×aim²)。 动态规划: 二维DP:定义dp[i][j]为前i种货币组成j的最少数量,通过状态转移方程优化内层循环。原创 2026-06-22 23:55:10 · 299 阅读 · 0 评论 -
加油站问题:环形数组中的良好出发点
本文介绍了环形加油站问题的优化解法。题目要求在给定加油站油量和距离数组的情况下,找出所有能够完成一圈行驶的出发点(良好出发点)。相比暴力解的O(N²)复杂度,文章提出了使用前缀和与单调队列的O(N)优化方案: 构建扩展净油量数组(长度2N)并计算前缀和 使用单调队列维护滑动窗口最小值 对每个起始点i,检查窗口[i,i+N-1]内最小值是否≥prefix[i-1] 该算法通过环形数组扩展、前缀和转换和单调队列优化,将时间复杂度从O(N²)降为O(N)。原创 2026-06-18 00:18:58 · 306 阅读 · 0 评论 -
滑动窗口进阶:统计满足条件的子数组数量
滑动窗口进阶:统计满足条件的子数组数量 本文介绍了一种高效算法,用于统计数组中满足"子数组最大值与最小值之差≤num"条件的子数组数量。核心思路是结合滑动窗口和单调队列: 使用双指针(L,R)维护窗口,两个单调队列分别跟踪窗口内的最大值和最小值 对于每个左边界L,尽可能扩展右边界R,直到不满足条件 统计以L为左边界的有效子数组数量为R-L 时间复杂度从暴力解法的O(n³)优化到O(n) 算法关键点在于利用单调队列高效维护窗口极值,并利用极值差的单调性避免不必要的计算。原创 2026-06-17 00:22:53 · 227 阅读 · 0 评论 -
滑动窗口最大值问题:单调队列的巧妙应用
本文介绍了使用单调队列高效解决滑动窗口最大值问题的方法。通过维护一个单调递减的双端队列存储元素索引,算法能在O(n)时间复杂度内找到每个窗口的最大值。关键步骤包括:1)维护队列单调性,移除小于新元素的队尾元素;2)检查队首元素是否超出窗口范围;3)当窗口形成时记录队首最大值。相比暴力解法的O(n×w)复杂度,这种优化方案显著提升了效率,特别适合处理大规模数据。文章结合示例详细演示了算法执行过程,并分析了复杂度,最后总结了单调队列在滑动窗口问题中的通用性。原创 2026-06-16 00:31:09 · 373 阅读 · 0 评论 -
给定一个二维数组matrix,可以从任何位置出发,走向上下左右四个方向,返回能走出来的最大长递增链长度。
摘要 本文介绍了三种求解矩阵中最长递增路径的方法:1) DFS+记忆化搜索,通过深度优先遍历和缓存结果优化性能;2) 拓扑排序,将矩阵视为有向图进行层次遍历;3) 动态规划,按值排序后递推计算。三种方法的时间复杂度均为O(mn),其中DFS+记忆化搜索最为简洁高效,能够避免重复计算并快速找到最长路径。该问题可应用于路径规划、图像处理等场景。原创 2025-09-28 17:46:15 · 212 阅读 · 0 评论 -
每日算法之:一个数组中只有两种字符‘G‘和‘B‘,可以让所有G都放在左侧,所有B都放在右侧 或者让所有G都放在右侧,所有B都放在左侧,但只能在相邻字符之间进行交换操作,返回至少需要交换几次?
一个数组中只有两种字符'G'和'B',可以让所有的G都放在左侧,所有的B都放在右侧或者可以让所有的G都放在右侧,所有的B都放在左侧,但是只能在相邻字符之间进行交换操作,返回至少需要交换几次原创 2025-09-12 01:31:52 · 304 阅读 · 0 评论 -
每日算法之:给定一个文件目录的路径,写一个函数统计这个目录下所有的文件数量并返回,隐藏文件也算,但是文件夹不算
给定一个文件目录的路径,写一个函数统计这个目录下所有的文件数量并返回,隐藏文件也算,但是文件夹不算原创 2025-09-11 00:18:19 · 228 阅读 · 0 评论 -
每日算法之:给定一个有序数组arr,代表坐落在X轴上的点,给定一个正数K,代表绳子的长度,返回绳子最多压中几个点? 即使绳子边缘处盖住点也算盖住
给定一个有序数组arr,代表坐落在X轴上的点,给定一个正数K,代表绳子的长度,返回绳子最多压中几个点?即使绳子边缘处盖住点也算盖住原创 2025-09-10 16:28:33 · 225 阅读 · 0 评论 -
统计给定字母在字符串中出现的次数
统计给定字母在字符串中出现的次数例:“I love java very much”方案一public int letterOfCount(String str , char letter){ int count = 0; //记录找到的个数 for(int i = 0; i < str.length(); i++){ if(str.charAt(i) == letter){ count++; } } return count;}方案二public int原创 2020-10-16 22:38:01 · 678 阅读 · 0 评论 -
将给定字符串每一个首字母大写
将给定字符串每一个首字母大写例:“this is a lesson about java” --> “This Is A Lesson About Java”public String firstLetterToUpperCase(String str){ String result = ""; //用于接收最终拼接完整的字符串 //将完整的字符串按照空格拆分 String[] value = str.split(" "); //循环处理每一个单词 截取首字母变大写 截取其余字母 整原创 2020-10-16 23:02:55 · 896 阅读 · 2 评论 -
将给定字符串位移X位
将给定字符串右位移x位置例如:helloworld 右位移两位 ldhellowor//传一个字符串 和 位移位数public String moveToRight(String str , int count){ if(count < 0){ System.out.println("您给定的位移个数不合理"); } if(count > str.length()){ count %= str.length(); //防止重复移 } //截取前半部分 /原创 2020-10-16 12:01:54 · 279 阅读 · 0 评论 -
字符串反转方法
将字符串反转方案一public String reverse(String str){ //将str变化为数组 char[] value = str.toCharArray(); //数组头尾互换 for(int i = 0; i < value.length/2; i++){ //使用异或交换数值(异或方法同样适用于字符) ch[i] = (char) (ch[i] ^ ch[str.length()-1-i]); c原创 2020-10-16 11:18:38 · 289 阅读 · 0 评论
分享