美文网首页
算法分析 [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

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