
算法分析与设计
biglamp
你好
展开
-
俄罗斯农名乘法
俄罗斯农名乘法适用于两个正整数相乘,只需要用到乘2、除2和加法操作。公式如下:该乘法经常被用于两数相乘取模的场景,如果两数相乘已经超过数据范围,但取模后不会超过,我们就可以利用这个方法计算中间结果后取模,保证每次运算都在数据范围内。实现://递归实现int ruM(int m, int n) { if (m == 1) return n; if (m % 2) return ruM((m - 1) / 2, 2 * n) + n; return ruM(m / 2, 2原创 2020-08-06 11:20:48 · 489 阅读 · 0 评论 -
算法分析与设计第十八周
这里直接采用手工乘法算法,两个循环即可解决,复杂度为o(n*m),n,m分别为两个字符串的长度代码:string multiply(string num1, string num2) { string result(num1.length() + num2.length(), '0'); for (int i = num1.length() - 1; i >= 0;原创 2018-01-06 16:10:15 · 253 阅读 · 0 评论 -
算法分析与设计第十七周
习题8.3——证明吝啬SAT问题是NP完全问题 问题描述:给定一组子句(每个子句都是其中文字的析取)和整数k,求一个最多有k个变量为true的满足赋值——如果该赋值存在。证明吝啬SAT问题为NP完全问题。显然吝啬SAT问题是NP问题,因为可以代入可能的解即可判断是否满足,时间是多项式的。已知SAT是NP完全问题,所以证明的关键是可以在多项式时间内将SAT规约到吝啬SAT。 证明如下: 对于任何原创 2017-12-29 21:50:00 · 202 阅读 · 0 评论 -
算法分析与设计第十五周
分析:对于原来的字符串,任何总数没有达到k的字符一定不会出现在满足要求的子串中,所以可以将其作为分界点,将原来的字符串一分为二,分而治之。每一次寻找分界点,耗费o(n),平均需要log(n)次递归,总的复杂度为o(nlog(n)),最差情况下,需要o(n^2).代码:class Solution {public: int longestSubstring(string s, int k)原创 2017-12-16 17:41:37 · 215 阅读 · 0 评论 -
算法分析与设计第十六周
分析:每次移除一个数,要尽可能使前面的数最小,因为前面的数的权值最大。而删除一个数,会导致后面紧接着的一个数代替删除的数的位置。所以在一次移除操作中,从前往后检查,一旦发现某个数后继的数更小,则删除此数。复杂度为o(k*n),可以采用递归的方法实现。(然而递归代码LeetCode显示内存超出,应该是栈溢出了,本地测试没问题。下面先给出递归代码,后面再给出迭代方法)递归代码class Solution原创 2017-12-23 14:28:57 · 301 阅读 · 0 评论 -
算法分析与设计
分析,此题可以用动态规划来做。子问题为:max(i)= max(i - 1)> 0 ? max(i - 1) + nums[i] : nums[i], max(i)表示以nums[i]结尾的子串的最大和,最后返回最大的那个即为所求,复杂度为o(n)代码:class Solution {public: int maxSubArray(vector<int>& nums) {原创 2017-11-26 20:29:24 · 283 阅读 · 0 评论 -
算法分析与设计第十三周
本周做了两题 第一题: 此题比较简单,直接上代码class Solution {public: int removeDuplicates(vector<int>& nums) { int index = 0; vector<int> tmp(nums.size(), 0); for (int i = 0; i < nums.size(); +原创 2017-12-01 22:35:21 · 235 阅读 · 0 评论 -
算法分析与设计第十四周
思路:用两个“指针”,后面的指针找合法的窗口,前面的指针来缩小窗口到最小,找出最小的那个即为答案。 代码:class Solution {public:string minWindow(string s, string t) { vector<int> m(128, 0); //记录t中字符对应的个数 for (auto c : t) m[c]++; //初始化m in原创 2017-12-08 23:02:52 · 269 阅读 · 0 评论 -
算法分析与设计第九周
分析:暴力法,列举所有的排列,复杂度为o(n!),显然不可取。如果原来的排列是降序的,则无法找到更大的排列,返回上升序的排列。如果不是降序的,则从尾部开始找,直到发现第一对nums[i] < nums[i+1],i记为flag1,可知从i以后,是降序的,所以从后往前找出第一个比nums[i]大的数,交换之。因为上一步的交换不会影响后面的数的降序,所以再将i后面的数翻转即可。算法复杂度为o(n) 代原创 2017-11-05 00:16:21 · 264 阅读 · 0 评论 -
算法分析与设计第十一周
分析:此题就是书上的例题,用动态规划解决。公式: if i == 0 且 j == 0,edit(i, j) = 0 if i == 0 且 j > 0,edit(i, j) = j if i > 0 且j == 0,edit(i, j) = i if i ≥ 1 且 j ≥ 1 ,edit(i, j) == min{ edit(i-1, j) + 1, e原创 2017-11-18 12:15:34 · 224 阅读 · 0 评论 -
算法分析与设计第六周
思路:简单直接,从第一个字符开始,查找以该字符为起点的回文,返回所有回文中最长的那个回文 代码:class Solution {public: string longestPalindrome(string s) { string result= ""; string temp; for (int i = 0; i < s.length();原创 2017-10-14 22:19:17 · 268 阅读 · 0 评论 -
算法分析与设计第七周
分析:最简单的是暴力法,即列举所以可能的组合,此法要嵌套扫两遍,所以复杂度为o(n^2). 然而此题可以用o(n)的复杂度解决,原因在于水桶原理,即关注短板。可以从两端开始,从短的一遍向内重选边,因为可能找到一个更长的边来抵消x轴减小带来的影响,并使高度与x轴乘机变大。重复上述步骤,直到两边重合。因此复杂度为o(n)。 代码:class Solution {public: int ma原创 2017-10-21 01:19:16 · 206 阅读 · 0 评论 -
算法分析与设计第八周
分析:最直接的方法,即用二维数组表示一个棋盘,然后每次找寻合法的位置放置皇后。但是这个方法效率较低,因为每次查找合法的位置时都要使用循环,耗费大量的时间。可以消去这些循环查找合法位置所耗费的时间,即找出空闲的列,和斜线。斜线分上斜线与下斜线。每条上斜线上的格子,行加列为固定值,每条下斜线的格子,行减列为固定值。因此不再是检查空闲的格子,而是检查空闲的列和斜线,这可以根据传来的参数(列)立即确定,插入原创 2017-10-28 17:43:20 · 177 阅读 · 0 评论 -
算法分析与设计第四周
思路:将源字符串s扫描一遍,找出n个不重复的子字符串,然后返回最长的那个的长度。 复杂度分析:查找子字符串要o(n^2),再乘以o(n)个子字符串,最后复杂度为o(n^3).实际情况可能要好很多,因为查找子字符串是否重复中的n只有少数能接近s.length().该算法的瓶颈在查找子字符串是否重复所花的时间。可以用树存储字符串,复杂度为o(nlogn!).代码:class Solution {pu原创 2017-09-30 23:25:43 · 222 阅读 · 0 评论 -
算法分析与设计第二周
算法分析与设计第二周本周做了一题,题目如下: You are given two non-empty linked lists representing two non-negative integers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the t原创 2017-09-15 20:02:25 · 351 阅读 · 0 评论 -
算法分析与设计第一周
第一周第一周讲了分治,但是找不到分治的题目,所以随便找了两道题做了一下。第一题:Implement atoi to convert a string to an integer.Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask your原创 2017-09-09 14:02:49 · 338 阅读 · 0 评论 -
算法分析与设计第三周
题目描述: 方法一:这是我最开始想到的方法,简答直接。先找到链表的长度count,然后删除第count-n+1个节点。需要两遍遍历。复杂度为o(n),n为链表的长度。 代码:class Solution {public: ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode* find = head;原创 2017-09-23 16:09:29 · 328 阅读 · 0 评论