深度优先搜索DFS、广度优先搜索BFS

比较

  • 拿谚语打比方的话,深度优先搜索可以比作打破砂锅问到底不撞南墙不回头;广度优先搜索则对应广撒网,多敛鱼
  • 两者没有绝对的优劣之分,只是适用场景不同
  • 当解决方案离树根不远或搜索深度可变时,BFS通常更好,因为只需搜索所有数据中的一部分。另外BFS的一个重要优点是它可以用于找到无权图(有权图用Dijkstra算法,贪心思想)中任意两个节点之间的最短路径(不能使用DFS)
  • 如果树比较宽而且深度有限,DFS可能是更优选项,因为DFS比BSF更节省空间,另外由于使用递归,DFS更好写(BFS必须手动维护队列)

时间复杂度

都是O(n)

空间复杂度

都是O(n)

经典题目

  1. LeetCode 102题,二叉树的层序遍历
    思路:

    1. DFS,深度优先,用level记录当前层,如果当前层记录完毕就return,结果数组用level索引当前层,结果数组容量小于等于level就扩容,再DFS递归到下一层
    2. BFS,广度优先,用队列先进先出的特性,先确定当前层的节点数量,遍历当前层,把当前层的下一层所有节点入队,当前层节点出队并放到一个临时数组,再添加到结果
// DFS-Java
class Solution {public List<List<Integer>> res = new LinkedList<>();public List<List<Integer>> levelOrder(TreeNode root) {dfs(0, root);return res;}private void dfs(int level, TreeNode root){if(root == null) return;if(res.size() <= level){res.add(new LinkedList<>());}res.get(level).add(root.val);dfs(level+1, root.left);dfs(level+1, root.right);}
}

// BFS-Java
class Solution {public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> res = new LinkedList<>();Queue<TreeNode> queue = new LinkedList<>();if(root == null) return res;queue.add(root);while(!queue.isEmpty()){int level = queue.size();List<Integer> tempList = new LinkedList<>();for(int i = 0; i < level; i++){if(queue.peek().left != null) queue.add(queue.peek().left);if(queue.peek().right != null) queue.add(queue.peek().right);tempList.add(queue.poll().val);}res.add(tempList);}return res;}
}

二分查找

本质

二分查找的本质是在一组单调有上下界可索引的数据中搜索目标值,三大条件缺一不可。

时间复杂度

O(logN)

空间复杂度

O(1)

经典题目

  1. LeetCode 69 题,x的平方根
    思路:

    1. 二分查找,因为y=x^2在x正半轴单调递增,且存在上下界1和x,所以可以使用二分查找逼近
    2. 牛顿迭代法,利用切线逼近,公式为 x = (x + a/x) / 2
// 二分查找
class Solution {public int mySqrt(int x) {if(x == 0 || x == 1) return x;long left = 1, right = x, mid = 1;while(left <= right){mid = left + (right - left) / 2;if(mid * mid > x){right = mid - 1;} else {left = mid + 1;}}return (int) right;}
}

// 牛顿迭代法
class Solution {public int mySqrt(int x) {long r = x;while (r * r > x) {r = (r + x / r) / 2;}return (int)r;}
}

贪心算法

本质

贪心的本质是通过每一步的局部最优,期望实现全局最优的一种算法思想。关键在于局部最优是否真的能实现全局最优。如果能实现,那么贪心算法基本上就是问题的最优解。

经典例题

  1. LeetCode 55题,跳跃游戏
    思路:

    1. 倒序贪心,看最后能不能到达第一个点
    2. 正序贪心,如果某个点可以跳到最后,那么它左边的点一定可以
// 倒序贪心
class Solution {public boolean canJump(int[] nums) {if (nums == null) return false;int endReachable = nums.length - 1;for (int i = nums.length - 1; i >= 0; i--){if(nums[i] + i >= endReachable){endReachable = i;}}return endReachable == 0;}
}

// 正序贪心
class Solution {public boolean canJump(int[] nums) {int maxPos = 0;for (int i = 0; i < nums.length; i++){if(i > maxLen) return false;maxPos = Math.max(maxPos, nums[i] + i);if(maxPos >= nums.length-1) break;}return true;}
}

深度搜索和广度搜索领接表实现_算法基础04-深度优先搜索、广度优先搜索、二分查找、贪心算法...相关推荐

  1. 深度搜索和广度搜索领接表实现_数据结构与算法--图的搜索(深度优先和广度优先)...

    数据结构与算法--图的搜索(深度优先和广度优先) 有时候我们需要系统地检查每一个顶点或者每一条边来获取图的各种性质,为此需要从图的某个顶点出发,访遍图中其余顶点,且使得每一个顶点只被访问一次,这个过程 ...

  2. 6.1 图的深度优先和广度优先搜索

    图的广度优先搜索 图的的搜索算法主要分为广度优先搜索(breadth-first search或BFS)和深度优先搜索(depth-first search或DFS).首先讨论广度优先搜索算法. 称之 ...

  3. Python 实现图的深度优先和广度优先搜索

    在介绍 python 实现图的深度优先和广度优先搜索前,我们先来了解下什么是"图". 1 一些定义 顶点 顶点(也称为"节点")是图的基本部分.它可以有一个名称 ...

  4. 深度优先和广度优先搜索

    目录 前言 1 深度优先搜索 2 广度优先搜索 3 深度优先和广度优先的比较 前言 最近面试,被问到了深度优先和广度优先搜索,这个我似曾相识,曾经大学的时候学到过,但是由于这几年的工作都未接触到,所以 ...

  5. Java实现算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)

    对算法导论中图的广度优先搜索(BFS)和深度优先搜索(DFS)用Java实现其中的伪代码算法,案例也采用算法导论中的图. import java.util.ArrayList; import java ...

  6. 邻接矩阵的深度优先和广度优先搜索

    c语言中图的邻接矩阵的深度优先和广度优先搜索 #include<stdio.h> #include<stdlib.h> typedef struct {int vexs[7]; ...

  7. 数据结构与算法(python):广度优先搜索(Breadth First Search,BFS)和深度优先算法(Depth First Search,DFS)

    参考自 MOOC数据结构与算法Python版 目录 一.广度优先搜索 1.1 BFS算法过程 1.2 广度优先搜索算法分析 二.深度优先搜索 2.1 骑士周游 2.1.1 问题定义 2.1.2 构建骑 ...

  8. 算法笔记练习 8.2 广度优先搜索(BFS) 问题 A: Jugs

    算法笔记练习 题解合集 本题链接 题目 In the movie "Die Hard 3", Bruce Willis and Samuel L. Jackson were con ...

  9. 算法基础部分4-深度优先搜索

    算法部分 基础4 一.深度优先搜索的简述 1. 深度优先搜索的简述   比如在图上寻找路径,就是一种深度优先搜索的典型例子.简单解释就是: 从起点出发,走过的点要做标记,发现有没走过的点,就随意挑一个 ...

最新文章

  1. Android短信拦截
  2. 【Android 异步操作】线程池 ( 线程池使用示例 | 自定义线程池使用流程 | 自定义任务拒绝处理策略 | 完整代码示例 )
  3. 未来10年,一类人率先失业,涉及8亿人!这8类人最安全,希望有你
  4. linux svn强制注释,svn强制提交时添加注释
  5. bootStrap-treeview插件
  6. 使用磁盘为Linux添加swap
  7. mac 不显示 外接屏幕_Mac外接屏幕亮度调整
  8. python编程计算器_Python编程之计算器/字符及界面
  9. SSH框架下的在线人数统计的一种解决途径
  10. ajax data参数
  11. hdu 1394 Minimum Inversion Number
  12. YOLOV4论文记录
  13. CCNA学习指南第十章
  14. 如何将图片中的表格变成Excel?这几个操作很简单
  15. 携程的产品与收入模式分析
  16. 推荐一个好用的搜索微信公众号文章的搜索引擎
  17. python数字转中文大写_python 数字转换为大写
  18. 智慧城市是什么,建设智慧城市需要哪些核心技术?
  19. 专业技术计算机应用能力考试题库,全国专业技术人员计算机应用能力考试题库-Excel,Word,XP...
  20. 安装maven的eclipse插件出现Cannot complete the install because one or more required items could not be found

热门文章

  1. 智能感知与万物互联学术讲座
  2. 吴恩达《机器学习》第七章:正则化
  3. 读书笔记——计算机组成原理
  4. Leetcode每日一题:3.无重复字符的最长子串
  5. 吴恩达|机器学习作业7.0.k-means聚类
  6. php设计模式课程---7、装饰器模式如何使用
  7. LeetCode刷题(22)
  8. python接口自动化(二十六)--批量执行用例 discover(详解)
  9. theos linux环境,theos安装详解
  10. linux脚本程序是什么意思,什么是shell脚本编程?