算法分析 [BFS、Greedy贪心] 2019-02-18

队列 和 栈

232. 用栈实现队列 Implement Queue using Stacks
双栈,出队列时,将in stack的值出栈至 out stack,然后取pop()
225. 用队列实现栈 Implement Stack using Queues
单队列,每次入队列的时候,将队列n-1的值q.offer(q.poll())实现栈

1. 图最短路径问题 - BFS - 广度优先

队列:用来存储每一轮遍历得到的节点
标记:对于遍历过的节点,应该将它标记,防止重复遍历

从节点A->B的最短举例,使用BFS
自增找到最小构成数的集合
最短完成单词转换(也可以用DP动态规划)

每次获取队列的长度,然后将全出队列(每个出的队列 与 剩余可以对比的值做计算),用一个计数器来记录最值,来实现BFS
最先获取到最值立即结束

2. 可达性问题 - DFS - 深度优先

:用栈来保存当前节点信息,当遍历新节点返回时能够继续遍历当前节点。也可以使用递归栈
标记:和 BFS 一样同样需要对已经遍历过的节点进行标记

需要全遍历才能获取结果
考虑边缘值,数组的边,需要特殊保存
普通 DFS主要用在可达性问题 ,这种问题只需要执行到特定的位置然后返回即可

3. 排列组合问题 - Backtracking - 回溯

在访问一个新元素进入新的递归调用时,需要将新元素标记为已经访问,这样才能在继续递归调用不用重复访问该元素
但是在递归返回时,需要将元素标记为未访问,因为只需要保证在一个递归链中不同时访问一个元素,可以访问已经访问过但是不在当前递归链中的元素

5. 贪心

5.1 根据字符串,匹配最多组成出回文数字符的个数

455. 小孩分配饼干问题 Assign Cookies
贪心算法 时间复杂度O(n+k),空间复杂度O(1)
对小孩满足值 和 饼干数量进行排序,从最小满足值 的小孩开始分配饼干,每分配完一个,饼干指针往后指一次

409. 最长回文数 Longest Palindrome easy
贪心算法 时间复杂度O(2n),空间复杂度O(m)
由于是英文,ascii只有128个,统计每个字符出现的个数
每字符出现偶数个,回文数字符+2,允许整个字符串出现最多1个奇数字符

5.2 匹配字符串是否为子集

392. 判断a字符串是否是b字符串的子集 Is Subsequence medium/easy
法1. 时间复杂度O(m+n) 空间复杂度O(1)
是否是子集,子集不需要是连续的但是顺序不能变,因此每次查找到位置的时候,都需要记忆下位置,后续基于位置再次开始查找

792. 匹配存在多少个子集 Number of Matching Subsequences medium/easy
法1. 时间复杂度O(n^2) 空间复杂度O(1)
使用392的结果进行计数
法2. 时间复杂度O(n^2) 空间复杂度O(n)
使用pass和out的Set集合来记忆已经判断过的字符串,可以快速判断出是否为子集,不需要再逐个去遍历,可以加快速度,但是最糟糕的复杂度还是没有变换

5.3 判断

665. 只允许改变一个值使数量变成非递减 Non-decreasing Array easy/medium
法1. 时间复杂度O(n) 空间复杂度O(1)
使用一个标识位记录是否已经修改过一次
每次出现非递减数值时,往前判断,核心代码

if(i-2<0 || nums[i-2]<=nums[i]) nums[i-1]=nums[i];
else nums[i] = nums[i-1];

决定改变哪个值

你可能感兴趣的:(算法分析 [BFS、Greedy贪心] 2019-02-18)