剑指Offer与算法
剑指Offer和算法
Jaymeng8848
攀爬每一个巨人,站在他们肩膀上看一看
展开
-
动态规划
此时,如果把问题规模降到0,即已知A0,可以得到A0->B. 如果从A0添加一个元素,得到A1的变化过程。即A0->A1; 进而有A1->A2; A2->A3; …… ; Ai->Ai+1. 这就是严格的归纳推理,也就是我们经常使用的数学归纳法; 对于Ai+1,只需要它的上一个状态Ai即可完成整个推理过程(而不需要更前序的状态)。我们将这一模型称为马尔科夫模型。对应的推理过程叫做“贪心法”。 然而,Ai与Ai+1往往不是互为充要条件,随着i的增加,有价值的前提信息越来越少,我们转载 2020-08-28 17:01:22 · 450 阅读 · 0 评论 -
贪心算法
1.贪心算法简介 1.1 基本定义 在贪婪算法(greedy method) 中,我们要逐步构造一个最优解。每一步,我们都在一定的标准下,做出一个最优决策。做出决策所依据的标准称为贪心准则(greedy criterion)。 贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。 也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。 贪心算法每一步必须满足以下条件: 1、可行的:即它必须满足问题的约束。 2、局部最优:他是当前步骤中所有可行选择中最佳的局部选择。转载 2020-08-27 08:41:16 · 182 阅读 · 0 评论 -
概率算法
大致执行步骤如下: 1.将问题转化为相应的几何图形S,S的面积容易计算,问题的结果往往对应几何图形中的某一部分。 2.然后,向几何图形中随机撒点。 3.统计几何图形S和S1中的点数,根据S和S1面积的关系及图形中的点数来计算得到的结果。 4.判断上述结果是否在需要的精度之内,如果未达到精度则执行步骤2;如果达到精度,则输出结果。 概率算法大致分为4种形式: 1)数值概率算法; 2)蒙特卡罗(Monte Carlo)算法; 3)拉斯维加斯(Las Vegas)算法; 4)舍伍德(Sherwood)算法; 二.转载 2020-08-27 08:15:52 · 1144 阅读 · 0 评论 -
递推算法
一.递推算法基本思想 递推算法是一种理性思维模式的代表,其根据已有的数据和关系,逐步推导而得到结果。其大致步骤如下: 1.根据已知结果和关系,求解中间结果。 2.判定是否达到要求,如果没有达到,则继续根据已知结果和关系求解中间结果;如果满足要求,则表示找到一个正确的答案。 小技巧:递推算法往往需要用户知道答案和问题之间的关系。在许多数学问题中,都有着明确的计算公式可以遵循,因此往往可以采用递推算法来实现。 二.递推算法典型实例 数学里面的斐波那契数列便是一个使用递推算法的经典例子。13世纪意大利数学家斐波那转载 2020-08-26 20:38:40 · 336 阅读 · 0 评论 -
递归算法
一.递归算法的基本思想 递归算法即在程序中不断反复调用自身来达到求解问题的方法。此处的重点是调用自身,这就要求待解决的问题能够分解为相同问题的一个子问题。这样通过多次调用,就可以完成求解。 递归调用是一个方法在其方法体内调用其自身方法的调用方式。这种方法也称为递归方法。在递归方法中,主调方法又是被调方法。执行递归方法将反复调用其自身。每调用一次就进入新的一层。在编写递归方法时,必须使用if语句强制方法在未执行递归调用前返回。如果不这样做,在调用方法后,它将永远不会返回。这是一个很容易犯的错误。 方法的递归调转载 2020-08-26 20:21:49 · 2259 阅读 · 0 评论 -
穷举算法
一.穷举算法的基本思想 穷举算法的基本思想就是从所有的可能的情况中搜索正确的答案,其执行步骤大致如下: 1.对于一种可能的情况,计算其结果; 2.判断结果是否满足要求,如果不满足则执行第1步来搜索下一个可能的情况;如果满足要求,则表示寻找到一个正确的答案。 注意事项:在使用穷举算法时,需要明确问题答案的范围,这样才能在指定的范围内搜索答案,指定范围之后,就可以使用循环语句和条件判断语句逐步验证可能性答案的正确性,从而得到正确的答案。 二.典型实例 比较典型的穷举算法的实例就是鸡兔同笼的问题: 今有鸡兔同笼,转载 2020-08-26 20:19:08 · 3012 阅读 · 0 评论 -
二进制中1的个数
题目描述 输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。 剑指Offer网友答案 绝对最佳答案及分析: public class Solution { public int NumberOf1(int n) { int count = 0; while(n!= 0){ count++; n = n & (n - 1); } retur原创 2020-08-24 11:17:11 · 97 阅读 · 0 评论 -
剑指Offer之变态台阶(JAVA)
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 规律比较简单: 其实我们所要求的序列为:0,1,2,4,8,16,…… 所以除了第一位外,其他位的数都是前一位的数去乘以2所得到的积。 public class Solution { public int JumpFloorII(int target) { if (target <= 0) return 0; return (int) Math.pow(原创 2020-08-12 09:53:55 · 71 阅读 · 0 评论 -
剑指Offer之跳台阶(JAVA)
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。 个人思路解法: 就是改变版斐波那契数列,太简单了 /** * <p>@author Jay</p> * <p>@date 2020/8/12 9:24</p> * <p>@Description:</p> * 题目描述 * 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶原创 2020-08-12 09:34:41 · 71 阅读 · 0 评论 -
剑指Offer之斐波那契数列(JAVA)
题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。 n<=39 主流思路和解法 描述 此题是非常经典的入门题了。我记得第一次遇到此题是在课堂上,老师拿来讲“递归”的(哈哈哈)。同样的类型的题还有兔子繁殖的问题。大同小异。此题将用三个方法来解决,从入门到会做。 考察知识:递归,记忆化搜索,动态规划和动态规划的空间优化。 难度:一星 方法一:递归 题目分析,斐波那契数列公式为:f[n] = f[n-1] + f[n-2], 初始值f原创 2020-08-12 08:59:27 · 170 阅读 · 0 评论 -
剑指Offer之旋转数组的最小数字(JAVA)
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 主流思路: 采用二分法解答这个问题, mid = low + (high - low)/2 需要考虑三种情况: (1)array[mid] > array[high]: 出现这种情况的array类似[3,4,5,6,原创 2020-08-12 08:42:27 · 80 阅读 · 0 评论 -
剑指Offer之用两个栈实现队列(JAVA)
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 主流思路: 栈A用来作入队列 栈B用来出队列,当栈B为空时,栈A全部出栈到栈B,栈B再出栈(即出队列) 主流解法: public class Solution { Stack<Integer> stack1 = new Stack<Integer>(); Stack<Integer> stack2 = new Stack<Integer>();原创 2020-08-12 08:24:59 · 152 阅读 · 0 评论