算法
凌风若果
喜欢蓝天,喜欢白云,更喜欢自己。
展开
-
利用回溯算法解决组合求和问题及其优化
利用回溯算法解决组合求和问题问题思路所有这类找出所有可行解的问题的都可以使用搜索回溯的方式解决。回到本题,我们定义递归函数 dfs(target, combine, idx) 表示当前在 candidates 数组的第 idx 位,还剩 target 要组合,已经组合的列表为 combine。递归的终止条件为 target <= 0 或者 candidates 数组被全部用完。那么在当前的函数中,每次我们可以选择跳过不用第 idx 个数,即执行 dfs(target, combine, i原创 2020-09-11 17:12:40 · 694 阅读 · 1 评论 -
三数之和 -双指针解法
三数之和 --双指针解法题目:一般解法三重循坏,分别取三个数,查看和是否为0即可,是就加入集合,不是进入下次迭代。双指针解法思路:原创 2020-09-11 15:05:59 · 306 阅读 · 0 评论 -
颠倒二进制位 ----巧妙的解法
颠倒二进制问题:将一个int型数据的二进制形式颠倒后,返回颠倒后的数据。简单解法:思路只需要把原来的数字二进制倒序遍历一遍就能得到逆序的二进制了,问题的关键变成了如何获取指定位的数据(是0还是1);注意由于使用的语言是java语言,没有无符号整数,所以要特别注意正数和负数的区别:正数左移:整体左移,符号位不变,右边补零。右移: 整体右移,左边补零负数左移: 整体左移,符号位不变,右边补零右移:整体右移,左边补1代码实现public class Solution原创 2020-09-10 14:01:58 · 2009 阅读 · 0 评论 -
质数相关的算法 --Sieve of Eratosthenes算法 (埃拉托斯特尼)
质数相关的算法 --Sieve of Eratosthenes算法 (埃拉托斯特尼)质数的定义相关的算法(问题为求小于整数n的所有质数的数量)暴力求解Sieve of Eratosthenes算法 (埃拉托斯特尼)质数的定义只能被自身与1整除的整数为质数,特殊的,0与1不是质数。相关的算法(问题为求小于整数n的所有质数的数量)暴力求解思路:双层循环,外层 循环变量 i 从2遍历到n-1, 内层循环变量 j从2遍历到i, 判断j是能整除i,如果存在j能整除i,则说明i不是质数。实原创 2020-09-06 23:53:26 · 455 阅读 · 0 评论 -
Fisher-Yates洗牌算法分析与理解
问题打乱一个没有重复元素的数组常规暴力解法讲数组的所有元素复制一份保存在一个ArrayList内,遍历数组,每次遍历生成一个在0到链表大小之间的随机数,将对应索引处的数组元素替换成链表中该随机数对应索引处的元素值,并从链表中移除该元素。时间复杂度: O(n*n)空间复杂度: O(n)Fisher-Yates洗牌算法思路我们可以用一个简单的技巧来降低之前算法的时间复杂度和空间复杂度,那就是让数组中的元素互相交换,这样就可以避免掉每次迭代中用于修改列表的时间了。算法原创 2020-09-06 16:25:47 · 610 阅读 · 0 评论 -
动态规划类问题解题步骤 --附例题(小偷问题)
动态规划类问题解题步骤 --附例题(小偷问题)动态规划基本思想适用情况优点解题步骤实例分析问题解题步骤动态规划基本思想动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再根据子问题的解以得出原问题的解。适用情况最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。最优子结构性质为动态规划算法解决问题提供了重要线索。无后效性。即子问题的解一旦确定,就不再改变,不受在这之后、包含它的更原创 2020-09-06 14:48:00 · 1721 阅读 · 0 评论 -
最小序列和问题的几种解法 --贪心+动态规划+分治法
最小序列和问题的几种解法 --贪心+动态规划+分治法问题解决方案1.贪心算法思路算法步骤完整代码2.动态规划思路算法步骤完整代码3.分治法思路算法步骤完整代码问题解决方案1.贪心算法思路维护一个当前序列和变量,如果这个变量小于零,就丢弃这个变量,重新初始化为零,重新从当前索引计算序列和。每次计算之后都要与最大值进行比较。算法步骤参数初始化当前序列和 : 初始化为零最大序列和 : 初始化为最小整数(Integer.MIN_VALUE)遍历数组判断当前序列和是否需要重置序列原创 2020-09-06 10:07:09 · 1219 阅读 · 0 评论 -
爬楼梯问题的几种解法 ----动态规划(递进与滚动数组) + 矩阵快速幂解法
问题普通的动态规划 ----递归由于最后一步一定是跳一阶或者两阶台阶,所以f(n) = f(n-1) + f(n-2), 这里复杂的问题变成了子问题求解,符合动态规划的使用条件,所以这道题可以用动态规划来做,递归代码如下:public int function(int n){ if(n==0||n==1){ //当台阶只有零阶一阶时只有一种走法。 return 1; } return function(n-1)+function(n-2);}改进 ----滚动数组上面的这种递归的原创 2020-09-05 20:16:16 · 490 阅读 · 0 评论 -
快速幂算法原理及优化
#快速幂算法#问题描述这道题的常规解法很简单,简单的一个循环就能搞定/***普通的求幂函数*@Param base 底数*@Param power 指数*@return 求幂结果是最后三位表示的整数**/public int normalPow(long base, long power){ long result = 1; for(int i=1;i<=power;i++){ result *= base; } return resul原创 2020-09-05 10:47:57 · 510 阅读 · 0 评论 -
常用的计算法则
计算法则取余运算计算法则(a+b) % p = (a%p + b%p) % p(a- b) % p = (a%p - b%p) % p(a* b) % p = (a%p * b%p) % p原创 2020-09-05 09:37:34 · 383 阅读 · 0 评论 -
二分查找实例分析 --第一个错误的版本
java二分查找分析总结使用场景原创 2020-09-05 00:25:12 · 168 阅读 · 1 评论 -
java实现快速排序算法详解
快速排序总结思路快速排序将一个集合分成两个区域,一个区域中的所有元素都比另外一个区域中的元素小。对分出来的区域再次进行划分,不断划分后,会形成一个完全有序的集合。算法参数待排序集合待排序区域的左边界索引待排序区域的有边界索引返回值快速排序无返回值步骤1:判断递归终止条件条件:待排序区域的左边界与右边界是否相等。2:参数初始化key:用来区分两个区域的值,左边区域所有区域都比key值小,右边区域都比key值大。 --初始化为最左边元素的值i:左边区域的右边界。(后面原创 2020-09-04 22:34:05 · 238 阅读 · 0 评论