如何判断一个题目用“贪心/动态规划“还是用“BFS/DFS”方法解决

1 总结

1.1 贪心、动态规划和BFS/DFS题解的关系

一般能使用贪心、动态规划解决一个问题时,使用BFS,DFS也能解决这个题,但是反之不能成立。

1.2

2 贪心 -> BFS/DFS

2.1 跳跃游戏1和3的异同

这两道题,“跳跃游戏”(题号 55)和“跳跃游戏 III”(题号 1306),虽然都是关于跳跃问题的,但它们的规则和解题策略有显著的不同。下面是它们的主要异同点:

2.1.1 跳跃游戏(题号 55)

  1. 问题描述:给定一个非负整数数组 nums,你最初位于数组的第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。需要判断是否能够到达最后一个下标。

  2. 跳跃规则:从任意位置 i,可以向前跳跃 0nums[i] 的任意步数。

  3. 目标:到达数组的最后一个下标。

  4. 解题策略:通常使用贪心算法。从左到右遍历数组,更新能够到达的最远位置。如果最远位置超过或等于最后一个下标,则返回 true

2.1.2 跳跃游戏 III(题号 1306)

  1. 问题描述:这里有一个非负整数数组 arr,你最开始位于该数组的起始下标 start 处。当你位于下标 i 处时,你可以跳到 i + arr[i] 或者 i - arr[i]

  2. 跳跃规则:从任意位置 i,只能向前跳到 i + arr[i] 或向后跳到 i - arr[i]

  3. 目标:跳到任何一个元素值为 0 的下标处。

  4. 解题策略:通常使用深度优先搜索(DFS)或广度优先搜索(BFS)。由于跳跃方向可以正向也可以反向,需要记录访问过的位置以防止无限循环。

2.1.3 它们的异同点

  • 跳跃方向和范围

    • 在“跳跃游戏”中,跳跃只能向前,且范围在 0nums[i] 之间。
    • 在“跳跃游戏 III”中,跳跃可以向前或向后,且步数固定为 arr[i]
  • 目标不同

    • “跳跃游戏”的目标是到达数组的最后一个下标。
    • “跳跃游戏 III”的目标是到达任一元素值为 0 的下标。
  • 解题策略

    • “跳跃游戏”通常用贪心算法解决。
    • “跳跃游戏 III”则更适合使用DFS或BFS,因为它涉及到多个可能的跳跃方向和回溯。

这两个问题虽然在表面上看起来类似,但实际上涉及到的算法思维和解决方法有很大的区别。

2.2 LC55. 跳跃游戏(贪心)

在这里插入图片描述

    public boolean canJump(int[] nums) {

        int n=nums.length;
        int e=0;
        boolean res=true;
        for(int i=0;i<n;i++){
            if(i>e){
                res=false;
                break;
            }
            e=Math.max(e, i+nums[i]);
        }
        return res;
    }

2.3 LC1306. 跳跃游戏 III

在这里插入图片描述

class Solution {
    public boolean canReach(int[] arr, int start) {
        int n=arr.length;
        
        boolean[]vis=new boolean[n];
        return dfs(arr,start,vis);

    }

    boolean dfs(int[] arr, int start,boolean[]vis){
        vis[start]=true;
        if(arr[start]==0){
            return true;
        }
        int rm=arr[start]+start;
        int lm=start-arr[start];
        boolean l=false;
        boolean r=false;
        if(rm<arr.length&&!vis[rm])
            l=dfs(arr,arr[start]+start,vis);
        if(lm>=0&&!vis[lm])
            r=dfs(arr,start-arr[start],vis);
        return l||r;
    }
    // bfs方法解题
    public boolean canReach2(int[] arr, int start) {
        int n=arr.length;

        Deque<Integer>st=new LinkedList<>();

        st.addLast(start);
        boolean[]vis=new boolean[n];
        while(!st.isEmpty()){
            int poll=st.pollLast();
            vis[poll]=true;
            if(arr[poll]==0){
                return true;
            }
            if(poll+arr[poll]<n&&!vis[poll+arr[poll]])
                st.addLast(poll+arr[poll]);
            if(poll-arr[poll]>=0&&!vis[poll-arr[poll]])
                st.addLast(poll-arr[poll]);
        }
        return false;
        
    }
}

2.4 LC1345. 跳跃游戏 IV

2.4.1 答案:为什么minJumps2超时了?


class Solution {
     public int minJumps(int[] arr) {
        Map<Integer, List<Integer>> idxSameValue = new HashMap<Integer, List<Integer>>();
        for (int i = 0; i < arr.length; i++) {
            idxSameValue.putIfAbsent(arr[i], new ArrayList<Integer>());
            idxSameValue.get(arr[i]).add(i);
        }
        Set<Integer> visitedIndex = new HashSet<Integer>();
        Queue<int[]> queue = new ArrayDeque<int[]>();
        queue.offer(new int[]{0, 0});
        visitedIndex.add(0);
        while (!queue.isEmpty()) {
            int[] idxStep = queue.poll();
            int idx = idxStep[0], step = idxStep[1];
            if (idx == arr.length - 1) {
                return step;
            }
            int v = arr[idx];
            step++;
            if (idxSameValue.containsKey(v)) {
                for (int i : idxSameValue.get(v)) {
                    if (visitedIndex.add(i)) {
                        queue.offer(new int[]{i, step});
                    }
                }
                idxSameValue.remove(v);
            }
            if (idx + 1 < arr.length && visitedIndex.add(idx + 1)) {
                queue.offer(new int[]{idx + 1, step});
            }
            if (idx - 1 >= 0 && visitedIndex.add(idx - 1)) {
                queue.offer(new int[]{idx - 1, step});
            }
        }
        return -1;
    }

    public int minJumps2(int[] arr) {
        int n=arr.length;

        Map<Integer,List<Integer>>mp=new HashMap<>();
        for(int i=0;i<n;i++){
            List<Integer>ls=mp.getOrDefault(arr[i],new ArrayList<>());
            ls.add(i);
            mp.put(arr[i],ls);
        }

        Deque<Integer>q=new LinkedList<>();

        q.offerLast(0);
        int ans=0;
        boolean[]vis=new boolean[n];
        while(!q.isEmpty()){
            int size=q.size();
            for(int i=0;i<size;i++){
                 int poll=q.pollFirst();

                if(poll==n-1){
                    return ans;
                }
                if(poll+1<n&&!vis[poll+1]){
                    vis[poll+1]=true;
                    q.offerLast(poll+1);
                }
                if(poll-1>=0&&!vis[poll-1]){
                    vis[poll-1]=true;

                    q.offerLast(poll-1);
                }
                List<Integer>t=mp.get(arr[poll]);
                for(int j=0;j<t.size();j++){
                    if(!vis[t.get(j)]&&t.get(j)!=poll){
                        vis[t.get(j)]=true;
                        q.offerLast(t.get(j));
                    }
                }
            }
            ans++;
            
        }
        return -1;
    }
}

让我们分析这两个方法 minJumpsminJumps2 的不同之处,以了解为什么 minJumps2 会超时。

2.4.2 方法 minJumps

  1. 数据结构:使用 HashMapHashSet 来存储相同值的索引和已访问的索引。使用 Queue 来进行广度优先搜索(BFS)。
  2. 访问控制:通过 visitedIndex(一个 HashSet)控制访问,一旦访问过某个索引,就不会再访问。
  3. 优化处理:在访问完所有相同值的索引后,使用 idxSameValue.remove(v) 来移除这个值,从而减少后续的无效搜索。

2.4.3 方法 minJumps2

  1. 数据结构:使用类似的 HashMap 来存储相同值的索引。使用 Deque(双端队列)进行BFS。
  2. 访问控制:通过一个 boolean 数组 vis 控制访问,记录已访问的索引。
  3. 重复检查:方法中没有移除已经访问过的值的索引集合,这意味着即使某个值的所有索引都已经被访问,它们仍然会在后续的搜索中被重复检查。

2.4.4 为什么 minJumps2 超时

原因可能在于 minJumps2 没有像 minJumps 那样有效地减少搜索空间。在 minJumps 中,一旦一个值的所有可能的跳跃位置都被探索过,这个值就会从 idxSameValue 中移除,从而避免了对这些位置的重复搜索。而 minJumps2 没有这样的优化,因此在遇到具有大量相同值的数组时,它会进行许多不必要的重复检查,这可能导致超时。

另外,虽然 minJumpsminJumps2 都是BFS实现,但由于对搜索空间的处理方式不同,两者在面对大规模数据时的性能表现会有显著差异。在这种情况下,减少无效的重复搜索是优化算法和避免超时的关键。

2.5 方法二改进

public int minJumps(int[] arr) {
        int n=arr.length;

        Map<Integer,List<Integer>>mp=new HashMap<>();
        for(int i=0;i<n;i++){
            List<Integer>ls=mp.getOrDefault(arr[i],new ArrayList<>());
            ls.add(i);
            mp.put(arr[i],ls);
        }

        Deque<Integer>q=new LinkedList<>();

        q.offerLast(0);
        int ans=0;
        boolean[]vis=new boolean[n];
        while(!q.isEmpty()){
            int size=q.size();
            for(int i=0;i<size;i++){
                 int poll=q.pollFirst();

                if(poll==n-1){
                    return ans;
                }
                if(poll+1<n&&!vis[poll+1]){
                    vis[poll+1]=true;
                    q.offerLast(poll+1);
                }
                if(poll-1>=0&&!vis[poll-1]){
                    vis[poll-1]=true;

                    q.offerLast(poll-1);
                }
                if(mp.containsKey(arr[poll])){
                    List<Integer>t=mp.get(arr[poll]);
                    for(int j=0;j<t.size();j++){
                        if(!vis[t.get(j)]&&t.get(j)!=poll){
                            vis[t.get(j)]=true;
                            q.offerLast(t.get(j));
                        }
                    }
                    mp.remove(arr[poll]);
                }

            }
            ans++;
            
        }
        return -1;
    }

3 dp -> BFS/DFS

3.1

3.2 LC64. 最小路径和

3.3 LC64 改编题:在一个m*n的矩阵中从(i,j)点开始走,每一次可以走上下左右四个方向,每走一步都会消耗m[x][y]体力,请问到达目标节点(t1,t2)最少需要耗费多少体力,lc上应该有这样类似的题目,列举出来。使用DFS或者BFS。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/189760.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

靡靡之音 天籁之声 ——Adobe Audition

上一期讲到了和Pr配合使用的字幕插件Arctime Pro的相关介绍。相信还记得的小伙伴应该记得我还提到过一个软件叫做Au。 当人们对字幕需求的逐渐满足&#xff0c;我们便开始追求更高层次的享受&#xff0c;当视觉享受在进步&#xff0c;听觉享受想必也不能被落下&#xff01; Au即…

Flutter桌面应用开发之毛玻璃效果

目录 效果实现方案依赖库支持平台实现步骤注意事项话题扩展 毛玻璃效果&#xff1a;毛玻璃效果是一种模糊化的视觉效果&#xff0c;常用于图像处理和界面设计中。它可以通过在图像或界面元素上应用高斯模糊来实现。使用毛玻璃效果可以增加图像或界面元素的柔和感&#xff0c;同…

一、深入简出串口(USRT)通信——基本概念。

一、前言 串口到底是什么&#xff1f;简单来说一句话就可以解释&#xff0c;串口就是一种通信协议。 看到这里可能大家会觉得你这不是放屁么&#xff0c;说了跟没说一样。所以这里做前言来描述&#xff0c;大家要先对通信协议有一个下意识地认识才能在学习串口的时候不至于迷茫…

spring循环依赖

Bean的生命周期 这里不会对Bean的生命周期进行详细的描述&#xff0c;只描述一下大概的过程。 Bean的生命周期指的就是&#xff1a;在Spring中&#xff0c;Bean是如何生成的&#xff1f; 被Spring管理的对象叫做Bean。Bean的生成步骤如下&#xff1a; Spring扫描class得到Bean…

yolo系列中的一些评价指标说明

文章目录 一. 混淆矩阵二. 准确度(Accuracy)三. 精确度(Precision)四. 召回率(Recall)五. F1-score六. P-R曲线七. AP八. mAP九. mAP0.5十. mAP[0.5:0.95] 一. 混淆矩阵 TP (True positives)&#xff1a;被正确地划分为正例的个数&#xff0c;即实际为正例且被分类器划分为正例…

计算机编程基础教程,中文编程工具下载,编程构件组合按钮

计算机编程基础教程&#xff0c;中文编程工具下载&#xff0c;编程构件组合按钮 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&#xff0c;而且可以开发大型的软件&#xff0c…

人力资源管理后台 === 登陆+主页灵鉴权

目录 1. 分析登录流程 2. Vuex中用户模块的实现 3.Vue-cli代理解决跨域 4.axios封装 5.环境区分 6. 登录联调 7.主页权限验证-鉴权 1. 分析登录流程 传统思路都是登录校验通过之后&#xff0c;直接调用接口&#xff0c;获取token之后&#xff0c;跳转到主页。 vue-elemen…

C++二分查找:统计点对的数目

本题其它解法 C双指针算法&#xff1a;统计点对的数目 本周推荐阅读 C二分算法&#xff1a;得到子序列的最少操作次数 本文涉及的基础知识点 二分查找算法合集 题目 给你一个无向图&#xff0c;无向图由整数 n &#xff0c;表示图中节点的数目&#xff0c;和 edges 组成…

HTTP状态码:如何修复 404 Not Found错误?

互联网上各种类型的网站非常多&#xff0c;无论用户还是网站运营者不可避免的会遇到404 Not Found错误&#xff0c;如果遇到404错误&#xff0c;我们应该如何解决呢&#xff1f; 对于用户 检查拼写错误 如果您是遇到错误的用户&#xff0c;请仔细检查 URL 是否有任何拼写错误…

【Flutter 常见问题系列 第 1 篇】Text组件 文字的对齐、数字和字母对齐中文

TextStyle中设置height参数即可 对齐的效果 Text的高度 是根据 height 乘于 fontSize 进行计算的、这里指定heiht即可、不指定的会出现 无法对齐的情况&#xff0c;如下&#xff1a; 这种就是无法对齐的情况

决策树(第四周)

一、决策树基本原理 如下图所示&#xff0c;是一个用来辨别是否是猫的二分类器。输入值有三个&#xff08;x1&#xff0c;x2&#xff0c;x3&#xff09;&#xff08;耳朵形状&#xff0c;脸形状&#xff0c;胡须&#xff09;&#xff0c;其中x1{尖的&#xff0c;圆的}&#xf…

R语言实现Lasso回归

一、Lasso回归 Lasso 回归&#xff08;Least Absolute Shrinkage and Selection Operator Regression&#xff09;是一种用于线性回归和特征选择的统计方法。它在回归问题中加入了L1正则化项&#xff0c;有助于解决多重共线性&#xff08;多个特征高度相关&#xff09;和特征选…

什么是轻量应用服务器?可以从亚马逊云科技的优势入手了解

什么是轻量应用服务器&#xff1f; 随着如今各行各业对云计算的需求越来越多&#xff0c;云服务器也被越来越多的企业所广泛采用。其中&#xff0c;轻量应用服务器是一种简单、高效、可靠的云计算服务&#xff0c;能够为开发人员、企业和个人提供轻量级的虚拟专用服务器&#x…

【深入剖析K8s】容器技术基础(一):从进程开始说起

容器其实是一种特殊的进程而已。 可执行镜像 为了能够让这些代码正常运行’我们往往还要给它提供数据’比如我们这个加法程序所需要的输人文件这些数据加上代码本身的二进制文件放在磁盘上’就是我们平常所说的一个程序,也叫代码的可执行镜像&#xff08;executablejmage&…

PostgreSQL+patroni+etcd+haproxy+keepalived高可用

PostgreSQLpatronietcdhaproxykeepalived 高可用架构 部署环境 部署postgresql-15 一主二从&#xff1a; role主机组件主库 node203 192.168.56.203 pg15.5 Patroni、Etcd&#xff0c;haproxy、keepalived 从库 node204 192.168.56.204 pg15.5 Patroni、Etcd&#xff0c;ha…

机器人开发的选择

喷涂机器人 码垛机器人 纸箱码垛机器人 焊接机器人 跳舞机器人 管道清理机器人 工地巡检机器人 点餐机器人 化工巡检机器人 装箱机器人 安防巡检机器人 迎宾机器人好像有点像软银那个 污水管道检测机器人 大酒店用扫地机器人 家用扫地机器人 工厂用&#xff08;…

免费不限字数的文本转语音AI配音工具,无需安装

上周给大家分享了AI绘本故事制作&#xff0c;很多小伙伴让我&#xff0c;推荐一款免费的AI配音&#xff0c;音色质量富有情感语调&#xff0c;而且手机上就能用的文本转语音工具。 OK&#xff0c;那么今天就给小伙伴们推荐一款我经常自用的AI配音工具&#xff0c;无需安装下载&…

防火墙命令行基础配置实验(H3C模拟器)

嘿&#xff0c;这里是目录&#xff01; ⭐ H3C模拟器资源链接1. 实验示意图2. 要求3. 当前配置3.1 PC配置3.2 FW配置&#xff08;防火墙&#xff09;[^7][^8]3.2.1 FW1配置3.2.2 FW2配置 3.3 R配置3.3.1 R1配置3.3.2 R2配置 3.4 SW配置3.4.1 SW1配置3.4.2 SW2配置3.4.3 SW3配置…

blender 3D眼球结构

角膜&#xff08;Cornea&#xff09;&#xff1a;眼球的前部&#xff0c;透明的曲面&#xff0c;负责折射光线。虹膜&#xff08;Iris&#xff09;&#xff1a;眼睛的颜色部分&#xff0c;控制瞳孔大小以调整进入眼睛的光量。瞳孔&#xff08;Pupil&#xff09;&#xff1a;虹膜…

offer 选择难?说说我的 2 个思考

大家好&#xff0c;我是鱼皮。秋招仍在进行中&#xff0c;随着越来越多的公司开奖&#xff0c;最近 编程导航星球 的小伙伴们也陆续发来了 offer 报喜&#xff1a; 图片 图片 但也有一部分小伙伴陷入了 “甜蜜的烦恼”&#xff0c;拿了几个 offer 却不知道怎么选择。 offer 选择…