算法设计与分析
zdinanyang
这个作者很懒,什么都没留下…
展开
-
LeetCode 251. Kth Largest Element in an Array
本题要求在一个数组中找出第k大的元素, 比如在[3,2,1,5,6,4]中找第2大的元素,函数应该返回5。 本题至少可以使用O(nlogn)的排序算法来将数组排序,课上讲过一种更好的类似快排的做法,今天做一下实现原创 2017-03-08 11:53:08 · 219 阅读 · 0 评论 -
LeetCode 435. Non-overlapping Intervals
本题给出一个数组,其中每个元素都包含一个开始和结束时间,要求在这个数组中删除最少的元素来使得整个数组中所有的活动没有重合。本题就是一段时间内所能安排最大活动数目的简单变形,需要应用贪心思想来解决,首先将所有的interval按结束时间排序,排第一的interval一定保证,然后逐个检查,如果和上一个安排的活动没有重合(开始时间不小于上次安排的活动的结束时间)就也要保证,遍历完整个数组,就能求出要删除原创 2017-05-08 16:59:25 · 246 阅读 · 0 评论 -
LeetCode 200. Number of Islands
本题给出一个二维的网格图,网格中包含’1’和’0‘两种元素,其中1代表陆地,0代表水域,上向左右连通的陆地形成一个岛,求网格图中一共有多少个岛。这一题是一个图的题目,给出的网格图并不是一个建立好的图,但是包含各个顶点的关系,即上向左右连通的陆地之间有一条边。求多少个岛,可以考虑利用图的遍历算法,使用DFS或者BFS来解题,从一点出发,能访问到的点都标记为’0‘,然后找下一个’1‘的点,求一共遍历了多原创 2017-05-08 14:57:16 · 199 阅读 · 0 评论 -
Leetcode 526 357
LeetCode 526. Beautiful Arrangement本题给定一个N,求1~N这N个数字一共有多少种排列方式,满足对第i位上的数字x,有x能被i整除,或i能被x整除。本题可以用dfs解决,首先从N开始,如果满足题设条件则有一条边从一个数字通向下一个数字,如果不满足则没有,如果搜索到最后,即这N个数字都被访问过则count++,注意搜索过一种情况后要将visited数字恢复原样,不影响原创 2017-05-22 13:51:33 · 340 阅读 · 0 评论 -
LeetCode 464. Can I Win
题目题目地址题目给定了一个游戏,规则是两个人玩这个游戏,玩之前先定好两个数字maxChoosableInteger和desiredTotal,玩家可以从1~maxChoosableInteger中任选一个数字,任何人选过一个数字后,这个数字就不能再被选中。两个人轮流选中,直到总和超过desiredTotal,最后一个选的人赢。问题是,给出maxChoosableInteger和desiredTota原创 2017-06-28 19:06:39 · 507 阅读 · 0 评论 -
LeetCode 126. Word Ladder II
题目题目给定两个单词(start和end)和由一组单词组成的词典,要求找到从start到end所有的变形序列,满足:每次只能改变一个字母;变形序列中的所有单词必须在词典中存在举例来说, start = "hit"end = "cog"dict = ["hot","dot","dog","lot","log"]返回[ ["hit","hot","dot","dog","cog"],原创 2017-06-03 11:58:35 · 423 阅读 · 0 评论 -
LeetCode 126. Word Ladder
题目题目给定两个单词(start和end)和由一组单词组成的词典,要求找到从start到end所有的变形序列,满足:每次只能改变一个字母;变形序列中的所有单词必须在词典中存在举例来说, start = "hit"end = "cog"dict = ["hot","dot","dog","lot","log"]一种可能的变换序列是”hit” -> “hot” -> “dot” -> “dog原创 2017-06-08 11:36:48 · 263 阅读 · 0 评论 -
LeetCode 53. Maximum Subarray
题目题目地址题目要求找出和最大的子串,比如[-2,1,-3,4,-1,2,1,-5,4],那么所求子串为[4,-1,2,1],和为6。分析本题是个简单题,但是思路也不大明显。可以考虑用分治法,对于任何一个序列都可以一分为二,左子序列的maxSum和右子序列的maxSum可以递归求出,当然不要忘了,还有一种是跨越左右子序列的子序列的maxSum,所求的和就是三者求最大值。前两种情况可以简单解决,对于第原创 2017-06-22 16:28:12 · 248 阅读 · 0 评论 -
《算法概论》习题8.22
题目:在任务调度中,常常会用到图。其中节点对应任务,任务i到任务j的有向边表示i是j的先期条件。这样的图描述了调度问题中的任务先后关系(约束)。显然,一个调度是可行的当且仅当该图无环;如果调度不可行,我们需要求使其无环所需的最小约束数量。给定一个有向图G=(V,E),子集E’⊆E称为反馈弧集合是指:将其移除后将使得G无环。反馈弧集合(FEEDBACK ARC SET,简称FAS)问题:给定有向图G=原创 2017-07-02 11:45:11 · 414 阅读 · 0 评论 -
LeetCode 547. Friend Circles
本题题目大意是一个班有N个学生,其中一些彼此是朋友,如果朋友的朋友也是朋友,现在定义一个朋友圈包含一组彼此是朋友的学生,求一个班共有多少朋友圈。题目的输入是一个邻接矩阵,很自然地可以想到用图的遍历算法来解题,可以用DFS从任意一点遍历一个朋友圈,若没有遍历完整个图,则从未被访问的一点开始继续遍历,重复这个过程直到遍历完整个图,这样就可以求出共有多少个朋友圈。本题也是并查集的一个经典的场景,可以使用并原创 2017-05-08 09:50:04 · 487 阅读 · 0 评论 -
LeetCode 332. Reconstruct Itinerary
题目【难度:Medium】:Given a list of airline tickets represented by pairs of departure and arrival airports [from, to], reconstruct the itinerary in order. All of the tickets belong to a man who departs from原创 2017-04-25 17:25:52 · 347 阅读 · 0 评论 -
LeetCode 461 191 477
LeetCode 461 191 477461. Hamming Distance本题需要求出两个整数的汉明距离,汉明距离是信息论中的一个概念,表示两个(相同长度)二进制数对应位不同的数量。 本题使用位操作,只需要统计两个变量抑或的结果的二进制中1的个数。#include <iostream>using namespace std;class Solution{public: int原创 2017-02-25 20:30:39 · 260 阅读 · 0 评论 -
LeetCode 240. Search a 2D Matrix II
本题要求在一个形如:[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30]]的矩阵中查找一个特定值,矩阵每行和每列都是有序的。 看到这一题,一个直接的想法就是二分查找,本题中的矩阵有序,可以仿照二分查找中的方法写原创 2017-03-05 10:45:46 · 326 阅读 · 0 评论 -
LeetCode 207. Course Schedule
这段时间课上在讲图论,就在LeetCode上找题做,图这部分有很多算法,最基本的还是DFS和BFS,下面是其中一道关于选课的题。 有n门课程,代号分别为0,1,2……n-1。其中有某些课程需要选过另一些课程才能选,如要选课程1,必须先选课程0和课程2。问能否把课程都修完。 选课的问题和穿衣服的问题类似,是一个典型的拓扑排序的问题,使用拓扑排序的方法不仅能给出是否可以修完的判断,还可以给出选课的顺原创 2017-03-18 15:02:21 · 248 阅读 · 0 评论 -
300. Longest Increasing Subsequence
最长递增子序列,这是一个动态规划的典型问题,正好可以应用这次课上讲的算法。在我的实现中,使用了遍历来查找辅助数组中的元素,看两个for循环就可以知道,算法的复杂度应该是O(n^2)。题目说可以找出一个O(nlogn)的解法,我觉得可能是因为辅助数组里存储的其实就是一个递增子序列,也就是有序的序列,可以使用二分查找,那样的效率会高很多,查找效率从O(n)下降到O(logn),总体的时间复杂度可以下降到原创 2017-04-07 19:09:10 · 243 阅读 · 0 评论 -
310. Minimum Height Trees
本题给出一个有树性质的无向图,可以选择任何一个点做树根,要求在所有可能性中,找出树高最小的MHTs,并输出树根。 本题给出的图本身就是一棵树,不是一个最小生成树的问题。理论上求出每个节点对应的树高,然后排序即可,这样的复杂度在O(v*v),没有试过这样能不能过。 另一方面,也可以将问题转化来看,首先,先不考虑两个节点以下的情况,很显然图中入度为0的点形成的树一定不是MHTs;入度为1的点也不是,原创 2017-03-31 17:14:15 · 334 阅读 · 0 评论 -
Leetcode 455 452
LeetCode 455. Assign Cookies本题要将m个曲奇分给n个孩子,每个孩子都有一个贪婪值,只有给这个孩子超过贪婪值的曲奇才能满足这个孩子,问最多可以满足多少孩子。 这是一个贪婪问题,因为最多给一个孩子一个曲奇,问题就简单很多,可以尽量用刚好能满足一个孩子的曲奇满足一个孩子,而且先对贪婪值小的孩子,再满足贪婪值大的。原创 2017-03-26 12:06:04 · 260 阅读 · 0 评论 -
LeetCode 72. Edit Distance
这道题是算法课程中刚刚讲过的,是一道经典的动态规划的问题。在编辑距离中定义了3种操作: - 插入: 插入一个字符,如”thank”=>”thanks”; - 删除:与插入相反,如”thanks”=>”thank”; - 替换:替换一个字符,如”Tom”=>”Tim”。 那么编辑距离就是从word1到word2需要几次上述操作。原创 2017-04-16 14:54:53 · 212 阅读 · 0 评论 -
LeetCode 402. Remove K Digits
本题题目大意是给出一个数字num(string形式),要求删除其中的k位,使得删除后得到的数字最小。比如num = “1432219”, k = 3,则输出就应该是”1219”。这一题可以用贪心的思想解决,删除k位其实就相当于k次删除一位,给出一个数字,删除一位的策略很明显就是删除一个尽量靠前且尽量大的数字,比如例子中的”1432219”,显然删除4最好,依据是显然删除大的数字好,但因为不能改变顺序原创 2017-05-15 10:56:49 · 269 阅读 · 0 评论 -
LeetCode 241. Different Ways to Add Parentheses
题目题目地址题目给出一个算式,包含加减乘三种运算,要求返回在所有可能的位置添加括号后的运算结果,结果可以重复。比如输入“2*3-4*5\” ,输出为[-34, -14, -10, -10, 10]。分析在任意一个数或一个算式都可以添加括号优先计算括号里的值,可以采用分治法,每个运算符前后都可以分为两个子问题,两个子问题的结果再根据预算符做运算,就能得出总的结果。子问题可以越分越小,最终只包含一个单独原创 2017-06-25 16:30:33 · 257 阅读 · 0 评论