美文网首页
算法分析 [BFS、Greedy贪心] 2019-02-18

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

作者: 哓晓的故事 | 来源:发表于2019-02-18 18:22 被阅读0次

队列 和 栈

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

    队列 和 栈 232. 用栈实现队列 Implement Queue using Stacks双栈,出队列时,将i...

  • 程序设计的16种类型

    Dynamic Programming(动态规划) Greedy(贪心算法) Complete Search(穷举...

  • 算法理论 | 贪心算法

    贪心算法 贪心算法,又称贪婪算法(Greedy Algorithm),是指在对问题求解时,总是做出在当前看来是最好...

  • 《数据结构与算法之美》31——贪心算法

    什么是贪心算法 贪心算法(英语:greedy algorithm),又称贪婪算法,是一种在每一步选择中都采取在当前...

  • 贪心算法 Greedy Algorithm

    当我们遇到一个问题的时候,怎么去寻找解决这个问题的最优方案。把这个问题分解成不同的步骤,然后把每一个步骤都运用贪心...

  • 贪心算法 greedy algorithm

    定义 又称贪婪算法 是一种在每一步选择中都采取当前状态下最好或最优的(即最有利的)选择,从而希望导致结果是最好或最...

  • LeetCode—— 跳跃游戏

    题目描述 一、CPP 1.贪心算法(Greedy Algorithm): 解题思路:这题最好的解法不是 DP,而是...

  • 爬山&退火算法-产品经理数学课(4)

    关键词:爬山算法、模拟退火算法、蒙特卡洛思想、贪心、Greedy策略、Metropolis准则 上古法师张忒柱的故...

  • 贪心算法

    概述 贪心算法(英语:greedy algorithm),又称贪婪算法,是一种在每一步选择中都采取在当前状态下最好...

  • 贪婪算法

    贪婪算法(Greedy Algorithm)也叫算贪心法,贪婪法.它是一个遵循启发式解决问题的算法范式.它的核心思...

网友评论

      本文标题:算法分析 [BFS、Greedy贪心] 2019-02-18

      本文链接:https://www.haomeiwen.com/subject/qnnaeqtx.html