
算法
学习各类算法
仲夏北斗星
这个作者很懒,什么都没留下…
展开
-
[数字规律、加减法] 罗马数字转整数
题目描述罗马数字包含以下七种字符:I,V,X,L,C,D和 M。字符 数值I 1V 5X 10L 50C 100D 500M 1000通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做IIII,而是IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 ...原创 2020-05-15 14:02:30 · 2244 阅读 · 0 评论 -
[数学、栈] 整数反转
题目描述给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为。请根据这个假设,如果反转后整数溢出那么就返回 0。数据样例输入: 123 输出: 321输入: -123 输出: -321输入: 120 输出: 21算法分析如果是一个字符串,怎么反转?使用栈思想,字符顺序入栈再出栈,就能得到反转的字符串。数字也是同理的,使用栈思想,但是多一步溢出的考虑。每一位的数字入栈...原创 2020-05-14 17:38:07 · 862 阅读 · 0 评论 -
[位运算、异或] 只出现一次的数字
题目给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。分析常规方法很容易,但是最巧妙最高效的方法应该是位运算,异或操作。异或操作满足三个特性: 任何数和 0做异或运算,结果都是原来的数。 任何数和自身做异或运算,结果都是 0 异或运算满足数学等式上的交换律和结合律 算法代码public int singleNumber(int[] nums) { int num = nums[0]; f.原创 2020-05-14 16:12:18 · 1006 阅读 · 0 评论 -
[贪心策略] 会场安排问题
题目假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个有效的贪心算法来进行安排。试编程实现对于给定的 k 个待安排活动,计算使用的最少会场。输入数据中,第一行是 k 的值,接下来的 k 行中,每行有 2 个正整数,分别表示 k 个待安排活动的开始时间和结束时间,时间以 0 点开始的分钟计。输出为最少的会场数。输入样例51 2312 2825 3527 8036 50输出样例3分析简单的贪心,先根据会议开始时间对所有会议进行升序排列,原创 2014-06-26 21:45:01 · 1138 阅读 · 0 评论 -
[排序算法、贪心算法] 程序存储问题
题目描述设有 n 个程序 { 1 , 2 , 3 , … , n } 要存放在长度为 L 的磁带上。程序i存放在磁带上的长度是 li , 1 ≤ i ≤ n 。要求确定这 n 个程序在磁带上的一个存储方案,使得能够在磁带上存储尽可能多的程序。输入格式输入数据中,第一行是 2 个正整数,分别表示程序文件个数和磁带长度L。接下来的 1 行中,有 n 个正整数,表示程序存放在磁带上的长度。输出格式输出为最多可以存储的程序个数。输入样例6 502 3 13 8 80 20输出样.原创 2014-06-26 21:49:02 · 4308 阅读 · 1 评论 -
[动态规划] 数塔问题
题目给定一个数塔,其存储形式如下图所示:在此数塔中,从顶部出发,每一个节点可以选择向左走或者向右走,一直走到底部,找出一条路径,使路径数值相加结果最大。分析这是一道简单的动态规划题,状态转移是自下向上的,算法思路:假如路径经过第四层2,第五层一定选19 假如路径经过第四层18,第五层一定选10 假如路径经过第四层9,第五层一定选10 假如路径经过第四层5,第五层一定选16 把第五层选择的数字加到第四层,就可以消去数塔第五层 依此类推,从下往上一层层的消除,只剩第一层,就是路原创 2014-07-05 19:41:50 · 3907 阅读 · 0 评论 -
[动态规划、贪心算法] 最长递增子序列
问题给定一个无序的整数数组,找到其中最长递增子序列的长度。样例第一个样例输入:[ 10, 9, 2, 5, 3, 7, 101, 18 ]输出:4解释:最长的递增子序列是 [ 2, 3, 7, 101 ]第二个样例输入:[ 1, 2, 2, 3, 3]输出:3解释:最长的递增子序列是 [ 1, 2, 3 ]解析先仔细留意第二个样例,从输出和解释可以发现,题目要求的最长递增子序列必须是一个严格递增子序列!这个点可不能忽视!提供两种思路:动态规划、贪心算法,.原创 2014-07-05 19:47:44 · 2542 阅读 · 0 评论 -
[分治法、蛮力法] 金块问题
题目一个老板有n 块金块,他要把最重的一块奖励给最优秀的员工,最轻的一块奖励给次优秀的员工。假设有一台比较重量的仪器,希望用最少的比较次数找出最重和最轻的金块。分析题意就是在一堆乱序元素中找到两个最值元素:最大值、最小值 本题解法思路有两种:分治法、蛮力法 分治算法实现上,又可以分两种思路:递归、非递归 只看比较次数的话,分治法比较次数稳定,蛮力法比较次数可能最优也可能最差分...原创 2014-06-26 21:41:31 · 6994 阅读 · 0 评论 -
[二分查找] 线性数组查找元素(Java版)
题目给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。分析线性升序数组,典型的二分查找算法 数组有序降低了题目难度,如果是无序数组,就先排序,再二分查找 算法实现有两种思路:递归、非递归 时间复杂度,空间复杂度算法代码(递归)public int s...原创 2014-06-26 21:37:55 · 3117 阅读 · 0 评论 -
求解素数(质数)集合的四种算法(Java版本)
素数又称质数,是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。介绍四种求解自然数n以内素数集合的方法,求解效率依次递进,想看最有效率的方法直接翻到最后就好。四种求解方法:常规方法,常规方法进阶版、埃氏筛法、欧拉筛法原创 2014-05-18 15:18:07 · 3967 阅读 · 0 评论 -
求解N!所得数末尾有多少个0?
题目:编程求解N!所得数末尾有多少个0?( n 由键盘输入,1000 分析:(假设末尾所得数有 K 个 0)1、N 的取值比较大,直接求解 N!很有可能会堆栈溢出。所以想采用 N!= M * 10^K 直接求解 K 的可行性不大2、对 N!进行质因数分解:N!=(2^x)*(3^y)*(5^z)…… 因为 10 = 2 * 5 ,所以分解后的等式中,(2^x)和(5^z)能组合原创 2014-04-03 19:56:55 · 1486 阅读 · 0 评论 -
两个整数交换反映出的三种解题思想(Java版)
数据交换是算法中经常会遇到的问题。下面以两个 int 整数 a,b 为例,列举三种实现方法:public class Main { public static void main(String[] args) { int a = 100, b = 200; long startTime, endTime; // 方法一 { startTime = System.n原创 2014-03-31 13:19:41 · 922 阅读 · 0 评论 -
[排序算法] 各类经典排序算法(动态图,Java实现)
常见排序算法基于比较的排序算法冒泡排序1. 算法描述2. 动图演示3. 代码实现选择排序1. 算法描述2. 动图演示3. 代码实现插入排序1. 算法描述2. 动图演示3. 代码实现归并排序 (非递归实现)1. 算法描述2. 动图演示3. 代码实现快速排序 (递归实现)1. 算法描述2. 动图演示3. 代码实现不基于比较的排序算法:计数排序1. 算法描述2. 动图演示3. 代码实现桶排序1. 算法描...原创 2020-04-27 19:33:09 · 590 阅读 · 0 评论