
02 编程之美_笔记
教练、我想打篮球
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
2.16 求一个数列的最长递增子序列
1. 前言本文的一些图片, 资料 截取自编程之美2. 问题描述3. 问题分析对于这种求优问题, 最基本的思路, 无疑便是穷举了 解法一 : 使用一个incSeq数组存放包含第i个数之前的最长的递增子序列的长度, 将每一个位置的最长递增子序列长度初始化为1, 然后遍历一次数组[循环变量为n], 在遍历的过程中再一次遍历incSeq (0, curN)[循环变量为i], 如果当前数大于arr[i],原创 2015-08-24 22:25:47 · 2874 阅读 · 0 评论 -
2.2 阶乘中的问题
1. 前言本文的一些图片截取自编程之美2. 问题描述3. 问题分析对于 第一个问题, 如果n比较小, 我们还能硬着头皮算, 但是如果n到达了一定的大小, 这个计算量是非常大的, 所以,我们需要利用数学知识找出其中的规律 根据上上面的分析, 我们只要计算出1-n 中能够分解出质因数5的个数即可 下面的代码中, 思路二, 优化了求质因数5的个数的计算对于 第二个问题 思路一 : 思路二 :原创 2015-08-11 20:13:39 · 897 阅读 · 0 评论 -
2.5 寻找最大的k个数
1. 前言本文的一些图片, 资料 截取自编程之美2. 问题描述3. 问题分析这道题是一道非常经典的题目, top k 因此解法也多种多样, 但是各有优劣 解法一 : 先将这n个数升序排序[这里选取olog(n)的快速排序], 然后找出[n-k, n), 即为所求 解法二 : 部分排序, 获取最大的k个数, 可以采用冒泡, 插入,简单选择排序, 等等 解法三 : 随机找出一个元素作为枢轴, 然原创 2015-08-15 21:08:20 · 479 阅读 · 0 评论 -
2.6/ 7 精确表示浮点数 + 最大公约数
1. 前言本文的一些图片, 资料 截取自编程之美2. 问题描述3. 问题分析这个问题, 说白了, 就是将小数表示转换为分数表示 小数表示 => 分数表示 对于有限不循环小数, 可以直接令分子分母同时乘上(10^小数位数), 比如 : 0.234, 可以将其视为(0.234/ 1), 然后分子分母同时乘以1000, 得到(234/ 1000), 然后在化简即为所求 对于无限循环小原创 2015-08-16 18:39:21 · 791 阅读 · 0 评论 -
2.8 寻找符合条件的数
1. 前言本文的一些图片, 资料 截取自编程之美2. 问题描述3. 问题分析这个问题主要 给定一个n, 然后寻找最小的能够整除n, 的并且只含有0, 1 的十进制数 解法一 : 穷举 0, 1, 10, 11, 100, 101, 110, 111, … 解法二 : 缓存<余数, 除以n余数为键的最小的整数>, 使用一个num计数, num从1开始, 每次迭代num*10, 遍历缓存表[遍历所有原创 2015-08-17 22:09:17 · 505 阅读 · 0 评论 -
2.8 找出整除n的只有0, 1的数
1. 前言本文的一些图片, 资料 截取自编程之美2. 问题描述3. 问题分析这个问题主要 给定一个n, 然后寻找最小的能够整除n, 的并且只含有0, 1 的十进制数 解法一 : 穷举 0, 1, 10, 11, 100, 101, 110, 111, … 解法二 : 缓存<余数, 除以n余数为键的最小的整数>, 使用一个num计数, num从1开始, 每次迭代num*10, 遍历缓存表[遍历所有原创 2015-08-17 22:17:28 · 581 阅读 · 0 评论 -
2.12 找出数组中和为给定的值的两个数字
1. 前言本文的一些图片, 资料 截取自编程之美2. 问题描述3. 问题分析对于这个问题, 我们常规的思路无非又是百无一变的穷举。。 解法一 : 穷举, 穷举出数组中任意两个数字的组合, 然后判断二者之和是否为给定的值 解法二 : 先将数组进行排序, 然后遍历所有小于 (给定的值/ 2), 如果在另一半中能够找到 (给定的值 - 当前值), 那么则说明, <当前值, 给定的值 - 当前值> 即为原创 2015-08-19 20:31:52 · 624 阅读 · 0 评论 -
2.13 子数组的最大乘积
1. 前言本文的一些图片, 资料 截取自编程之美2. 问题描述3. 问题分析对于这个问题, 我们的通常的思路, 可能是就计算出所有的数字的乘积, 然后在遍历数组逐个除以当前元素, 找出所有子数组的最大值, 但是很遗憾, 这里限制了不能使用除法。。呵呵 别人知道你会这样想,, 解法一 : 使用两个辅助的数组, 遍历数组一次, 计算出start, end数组, start数组中元素表示数组中当前元素之原创 2015-08-19 21:05:17 · 478 阅读 · 0 评论 -
2.14 子数组之和的最大值
1. 前言本文的一些图片, 资料 截取自编程之美2. 问题描述3. 问题分析对于这种求优问题, 最基本的思路, 无疑便是穷举了 解法一 : 使用left, right 确定一个边界, 然后求解left, right 之间的和, 如果和大于max, 则更新max, 穷举所有的left, right, 最后max即为所求 解法二 : 注意到上面left, right, 求和 会构成一个三层循环, 而原创 2015-08-20 20:03:33 · 589 阅读 · 0 评论 -
4.4 给定的点是否在三角形之内
1. 前言本文的一些图片, 资料 截取自编程之美2. 问题描述3. 问题分析假设给定的三角形为ABC, 给定的点为D, 使用S(ABC) 表示ABC三个点构成的三角形的面积 解法一 : 连接AD, BD, CD, 然后求解S(ABC); S(DBC), S(ADC), S(ABD), 如果S(ABC) == S(DBC) + S(ADC) + S(ABD), 则说明给定的点D是在三角形ABC内部,原创 2015-09-10 21:49:01 · 616 阅读 · 0 评论 -
2.15 求二维数组的子矩阵的最大和
1. 前言本文的一些图片, 资料 截取自编程之美2. 问题描述3. 问题分析对于这种求优问题, 最基本的思路, 无疑便是穷举了 所以 我们这里三种思路, 均为穷举。。。 解法一 : 穷举左上角的点, 然后在穷举所有可能该宽高, 计算矩阵的和, 统计最大值 解法二 : 穷举左上角的点, 然后在穷举所有可能该宽高, 计算矩阵的和, 通过预处理一些数据, 是的这个计算时间复杂度降到O(1) 解法三原创 2015-08-20 20:58:24 · 1058 阅读 · 0 评论 -
3.8 二叉树中结点最大的距离 & 重建二叉树 & 顺序遍历二叉树
1. 前言本文的一些图片, 资料 截取自编程之美2. 问题描述3. 问题分析对于树的相关问题, 递归是非常常见的对于第一个问题 : 可以通过先递归获取每一个结点的最大左子树的深度, 以及最大右子树的深度, 然后在递归一次获取(node.maxLeft + node.maxRight)的最大值即为所求对于第二个问题, 因为我们现在有一个先序, 中序的遍历序列, 所以我们可以确定root结点即为先序遍历原创 2015-09-05 19:55:23 · 695 阅读 · 0 评论 -
4.7 蚂蚁爬杆问题
1. 前言本文的一些图片, 资料 截取自编程之美2. 问题描述3. 问题分析根据问题, 绘制一张状态图 : 解法一 : 模拟每一只蚂蚁的运动, 并以 各个蚂蚁的单位移动量需要的时间的最小公倍数 为周期检测所有的蚂蚁的情况, 检测碰撞, 统计每一只蚂蚁离开竹竿的时间, 最后的结果中找出最大, 最小值即为所求解法二 : 将两只蚂蚁的碰撞 假想为两只蚂蚁的擦肩而过 那么, 这样一看起来, 所有的蚂蚁原创 2015-09-18 22:40:30 · 1455 阅读 · 0 评论 -
4.9 数独问题
1. 前言本文的一些图片, 资料 截取自编程之美2. 问题描述额, 4.9 这里的问题是 给定一个残缺的数独, 粗鲁额的计算一下大概有多少种解法, 以及多少种独立的解答, 。。。一看 这个便是一个数学问题,,, 算了 跳过算了, 跳到了1.9, 这个是关于如果解决填充残缺的数独的问题的其实, 对于数独的解法, 我也是在贴吧看见一个家伙, 在说, 貌似是那家伙要找一个提高他自己的解决数独效率, 然后原创 2015-09-26 21:22:56 · 693 阅读 · 0 评论 -
2.10 寻找数组中的最大值和最小值
1. 前言本文的一些图片, 资料 截取自编程之美2. 问题描述3. 问题分析对于这个问题, 我们最常规的思路, 就是 : 解法一 : 就是遍历一次数组, 如果当前元素, 比max大, 或者比min小, 则记录下其值, 通过这样依次遍历, 即找出了数组的最大值和最小值, 这样比较了 (2 * n)次 解法二 : 首先遍历一次数组, 两个相邻的数一组[(0, 1), (2, 3), … ], 将原创 2015-08-18 20:39:13 · 820 阅读 · 0 评论 -
2.9 Fibonacci数列
1. 前言本文的一些图片, 资料 截取自编程之美2. 问题描述3. 问题分析这个问题, 也是一个经典的问题, 但是通常, 我们看到的解法大概就是递归思路, 以及循环的思路两种, 这里给出了一个巧妙的解法, 利用矩阵相乘的性质, 来求解fibonacci 数列 解法一 : 常规的递归思路, 递归退出条件为n 为0 或者1 解法二 : 因为fibonacci的递归思路, 中实际上存在很多的重复计算,原创 2015-08-18 20:09:58 · 513 阅读 · 0 评论 -
2.18 数组的分割
1. 前言本文的一些图片, 资料 截取自编程之美2. 问题描述3. 问题分析书中给出了两种思路, 书中的第二种解法和第三种解法都是依赖于第二种思路 解法一 : 将数组分为left, right 两部分, 然后再启发式的交换两边的元素, 这样做的优势是在于交换的次数比较少, 而缺陷在于left 和right 两边的和的delta可能不为最小解法二 : 计算出任意i个元素之和为k的可能情况, 然后在从原创 2015-08-25 21:36:43 · 621 阅读 · 0 评论 -
2.17 数组循环移位
1. 前言本文的一些图片, 资料 截取自编程之美2. 问题描述3. 问题分析对于 这个问题, 书中给出了两种思路 解法一 : 将移动的位数模上数组的长度, 获取最后需要移动的位数[得到移动位数k], [因为移动的位数, 可能大于数组的长度], 然后在循环k次, 每次向右移动一位解法二 : 相对于第一种解法来说, 巧妙的多, 模上数组的长度, 计算出真是需要移动的位数[得到移动位数k], 然后逆转[原创 2015-08-25 20:31:57 · 521 阅读 · 0 评论 -
3.1 字符串移位包含问题
1. 前言本文的一些图片, 资料 截取自编程之美2. 问题描述3. 问题分析解法一 : 迭代arr.length 次, 每次比较arr中是否包含目标字符串, 如果不包含, 则右移一位, 继续循环, 否则 跳出循环 返回true解法二 : 如果目标字符串是arr的循环移位子字符串, 那么目标字符串必定是 arr + arr, 的子字符串 当然在进入方法的时候, 需要对目标字符串 和arr的长度进行校原创 2015-08-26 21:51:28 · 628 阅读 · 0 评论 -
2.19 区间重合判定
1. 前言本文的一些图片, 资料 截取自编程之美2. 问题描述3. 问题分析解法一 : 遍历目标区间, 从源区间中依次减去目标区间的区间段, 如果最后源区间还存在数据, 则说明源区间不是完全在目标区间中解法二 : 首先归并目标区间的各个可以归并的区间段, 然后在采用思路一的方案, 遍历目标区间现在的区间段(们), 如果最后源区间还存在数据, 则说明源区间不是完全在目标区间中4. 代码/** * f原创 2015-08-26 21:30:04 · 1044 阅读 · 0 评论 -
3.2 电话号码对应的英语单词
1. 前言本文的一些图片, 资料 截取自编程之美2. 问题描述3. 问题分析一个数字, 对应一个字符数组, 这个问题其实就是穷举出这个数字数组能够表示的所有的字符的拼凑, 然后找出为单词的序列 这里 我只做了穷举 “数字数组 -> 字符序列”解法 : 使用一个pos数组, 来表示使用第i个数字的第pos[i]个字符, 然后设计一个累增的方法来控制pos的增长, 至于迭代方式 可以选用循环, 也可以原创 2015-08-27 18:24:46 · 571 阅读 · 0 评论 -
3.7 队列的最大值问题
1. 前言本文的一些图片, 资料 截取自编程之美2. 问题描述3. 问题分析解法一 : 在队列添加元素的时候 如果添加的元素大于当前的最大元素, 则对最大元素进行更新, 在队列删除元素的时候, 如果删除元素即为最大的元素, 则遍历一次列表更新最大的元素解法二 : 使用一个列表维护进队, 出队的顺序, 然后使用一个大根堆来维护最大的元素, 如果添加的元素大于当前的最大元素, 则添加元素重新整堆,原创 2015-08-28 22:03:27 · 860 阅读 · 0 评论 -
3.4 从无头链表中删除给定的结点 & 遍历一次逆转链表
1. 前言本文的一些图片, 资料 截取自编程之美2. 问题描述 3. 问题分析第一个问题 : 因为给出的只是一个链表的结点, 来删除当前结点, 所以想要找出当前结点的前一个结点貌似不可能, 所以只有另想一种方法了 这里的方法是 : “狸猫换太子”, 将下一个元素的数据复制到当前结点上面, 然后在删除下一个元素, 已达到”删除当前结点”的目的第二个问题 : 记录下当前结点的下一个结点的下一个结点,原创 2015-08-28 14:32:06 · 581 阅读 · 0 评论 -
3.6 判断两个无环链表是否相交 & 找出相交的第一个结点
1. 前言本文的一些图片, 资料 截取自编程之美2. 问题描述 3. 问题分析这两个问题也是非常经典的问题对于第一个问题 : 解法一 : 穷举, 穷举两个链表的各个元素, 判断有没有相同的结点解法二 : 遍历一次较长的链表, 然后将其唯一标识存在一个容器ids中, 然后在遍历一次另一个链表, 查找第二个链表中的元素是否存在于ids中, 如果存在, 则说明存在交点解法三 : 将一个链表连接到另一个原创 2015-08-28 15:05:46 · 697 阅读 · 0 评论 -
1.5 快速找出故障的机器
1. 前言本文的一些图片截取自编程之美2. 问题描述3. 问题分析对于第一个问题, 书中给出了几种算法 第一种 : 遍历一次机器列表, 然后统计出 机器的id, 和出现的次数的映射4. 代码/** * file name : Test01FindBadMachine.iava * created at : 8:43:20 AM May 12, 2015 * created by 970655原创 2015-08-09 21:07:39 · 612 阅读 · 0 评论 -
2.1 二进制中1的个数
1. 前言本文的一些图片截取自编程之美2. 问题描述3. 问题分析这个问题就是给定一个8个0/ 1, 然后求解其中1的个数书上给出了五种思路 第一种 : 将这个数模上2, 如果结果为1, 则说明最后一位为1, counter++, 然后再将这个数除以2, 直到这个数为0, counter即为所求 第二种 : 利用位操作优化上面的算法, 思路基本一致, 优化了求模 和除法 第三种 : 通过((原创 2015-08-10 19:30:41 · 438 阅读 · 0 评论 -
1.3 翻烙饼问题
1. 前言本文的一些图片截取自编程之美2. 问题描述3. 问题分析 书上提供了两种思路 一种 : 就是每一次用两次交换将当前最大的烙饼翻到最下面 另一种 : 是递归穷举, 上界为上面的分析出的(2 * (n - 1)) 但是, 我这里并没有实现递归穷举的算法, 我这里实现的另一种思路是 : 将相邻的有序的数字(们), 一起翻转, 但是从效果上来看,貌似这个思路, 和第一个思路相差不大呀原创 2015-08-09 19:46:43 · 1032 阅读 · 0 评论 -
1.2 将帅问题
1. 前言本文的一些图片截取自编程之美2. 问题描述3. 问题分析我们先将这个问题换个方式表现出来 如下图, 我们假设将 & 帅的方位如下, 0-8 表示各个位置 从图中,我们可以看出, 只要((将的位置%3) == (帅的位置%3) ), 那么这将帅就照面了 我们需要求的是将帅不照面的情况, 所以我们需要的是((将的位置%3) != (帅的位置%3) )因为要求我们只是用一个变量, 所以 必原创 2015-08-09 16:29:05 · 566 阅读 · 0 评论 -
2.3 寻找"水贴王"
1. 前言本文的一些图片截取自编程之美2. 问题描述3. 问题分析对于这个题目, 书上给出了三种思路 第一种 : 先遍历一次所有的帖子, 统计出 <发帖人, 发帖次数>, 然后在遍历一次映射, 找出发帖次数超过一半的发帖人 即为所求 第二种 : 将所有的id[包括重复]进行排序, 然后最中间的id即为所求 第三种 : 逐渐减小问题的规模的算法, 每一次删除两个不同的id, 那么剩下的id列表中原创 2015-08-11 20:38:15 · 1039 阅读 · 0 评论 -
2.4 1的数目
1. 前言本文的一些图片, 资料 截取自编程之美2. 问题描述3. 问题分析对于第一个问题 书中给出了两种算法 第一种 : 遍历一次1-n 统计出每一个数的出现的1的次数, 然后累加起来 第二种 : 利用数学方法找出规律, 然后计算 [呵呵, 一看就知道经过仔细思考过的算法效率高的多]现在以 113为例解释一下第二种算法 1-113 中1出现的次数 = 1-113中[个位为1的数字的个数 +原创 2015-08-12 21:25:30 · 499 阅读 · 0 评论