【LeetCode热题100】打卡第20天:合并区间不同路径

news2024/11/20 18:34:20

文章目录

  • 【LeetCode热题100】打卡第20天:合并区间&不同路径
    • ⛅前言
  • 合并区间
    • 🔒题目
    • 🔑题解
  • 不同路径
    • 🔒题目
    • 🔑题解

【LeetCode热题100】打卡第20天:合并区间&不同路径

⛅前言

大家好,我是知识汲取者,欢迎来到我的LeetCode热题100刷题专栏!

精选 100 道力扣(LeetCode)上最热门的题目,适合初识算法与数据结构的新手和想要在短时间内高效提升的人,熟练掌握这 100 道题,你就已经具备了在代码世界通行的基本能力。在此专栏中,我们将会涵盖各种类型的算法题目,包括但不限于数组、链表、树、字典树、图、排序、搜索、动态规划等等,并会提供详细的解题思路以及Java代码实现。如果你也想刷题,不断提升自己,就请加入我们吧!QQ群号:827302436。我们共同监督打卡,一起学习,一起进步。

博客主页💖:知识汲取者的博客

LeetCode热题100专栏🚀:LeetCode热题100

Gitee地址📁:知识汲取者 (aghp) - Gitee.com

题目来源📢:LeetCode 热题 100 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台

PS:作者水平有限,如有错误或描述不当的地方,恳请及时告诉作者,作者将不胜感激

合并区间

🔒题目

原题链接:56.合并区间

在这里插入图片描述

🔑题解

  • 解法一:排序+枚举

    说实话,这里我一开始是没考虑到,示例数据居然是无序的,刚开始做的时候,我直接默认认为示例数据是有序的,导致接连错误。后来发现原来示例数据是无序的。所以我们一开始要对数组进行排序,这里使用了Arrays+比较器对数组进行排序。排完序后,题目就会变得很简单了,相信看完代码你应该是能够懂的,这里没有什么算法,有的就是逻辑,不懂的欢迎评论区留言(●’◡’●)

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    /**
     * @author ghp
     * @title 跳跃游戏
     */
    class Solution {
        public int[][] merge(int[][] intervals) {
            if (intervals.length == 0) {
                return new int[0][2];
            }
            // 按照数组每行第一个元素进行升序排序
    //        Arrays.sort(intervals, Comparator.comparingInt(arr -> arr[0])); // 写法一
            Arrays.sort(intervals, (arr1, arr2) -> arr1[0]-arr2[0]); // 写法二
    //                Arrays.sort(intervals, new Comparator<int[]>() { // 写法二的完整写法
    //            public int compare(int[] interval1, int[] interval2) {
    //                return interval1[0] - interval2[0];
    //            }
    //        });
            List<int[]> list = new ArrayList<>();
            // 遍历数组,对数组进行合并
            for (int i = 0; i < intervals.length; i++) {
                int l = intervals[i][0];
                int r = intervals[i][1];
                if (list.size() == 0 || list.get(list.size() - 1)[1] < l) {
                    // 相邻数组没有重叠区间,不能合并
                    list.add(new int[]{l, r});
                } else {
                    // 相邻数组有重叠区间,需要合并
                    list.get(list.size()-1)[1] = Math.max(list.get(list.size()-1)[1], r);
                }
            }
            // 将list数组转化成数组,并返回
            return list.toArray(new int[list.size()][]);
        }
    }
    

    复杂度分析:

    • 时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
    • 空间复杂度: O ( l o g n ) O(logn) O(logn)

    其中 n n n 为数组中元素的个数

不同路径

🔒题目

原题链接:62.不同路径

在这里插入图片描述

🔑题解

  • 解法一:DFS(时间超限)

    直接暴力DFS,不出所料超时了

    /**
     * @author ghp
     * @title 不同路径
     */
    class Solution {
    
        private int count = 0;
    
        public int uniquePaths(int m, int n) {
            bfs(m, n, 0, 0);
            return count;
        }
    
        private void bfs(int m, int n, int r, int d) {
            if (r == n - 1 && d == m - 1) {
                // 当前路径到达终点
                count++;
                return;
            }
            if (r > n - 1 || d > m - 1) {
                // 出界
                return;
            }
            // 往左走
            bfs(m, n, r + 1, d);
            // 往下走
            bfs(m, n, r, d + 1);
        }
    }
    

    复杂度分析:

    • 时间复杂度: O ( 2 n ) O(2^n) O(2n)
    • 空间复杂度: O ( n ∗ m ) O(n*m) O(nm)

    其中 n n n 为列, m m m为行

    代码优化:DFS+记忆搜索

    前面我们直接暴力DFS,发现时间复杂度居然高达 2 n 2^n 2n,显然很容易超时。这里我们可以使用一个数组来记录每次遍历能够到达终点的路径条数(俗称“记忆搜索”),这样能够避免很多重复的搜索,从而大大提高搜索效率

    import java.util.Arrays;
    
    /**
     * @author ghp
     * @title 不同路径
     */
    class Solution {
    
        public int uniquePaths(int m, int n) {
            int[][] path = new int[m][n]; // 用于记录每个节点到达终点的次数
            // 初始化path数组
            for (int i = 0; i < path.length; i++) {
                Arrays.fill(path[i], -1);
            }
            path[m-1][n-1] = 1;
            // 深搜
            dfs(path, m, n, 0, 0);
            return path[0][0];
        }
    
        private int dfs(int[][] path, int m, int n, int y, int x) {
            if (path[y][x] != -1) {
                // 该点已经走过,直接返回
                return path[y][x];
            }
            int count = 0;
            if (y + 1 < m) {
                // 往下
                count += dfs(path, m, n, y + 1, x);
            }
            if (x + 1 < n) {
                // 往右
                count += dfs(path, m, n, y, x + 1);
            }
            // 记录当前节点能够到达终点的路径条数(核心步骤)
            path[y][x] = count;
            return count;
        }
    }
    

    复杂度分析:

    • 时间复杂度: O ( n ∗ m ) O(n*m) O(nm)
    • 空间复杂度: O ( n ∗ m ) O(n*m) O(nm)

    其中 n n n 为列, m m m为行

  • 解法二:动态规划

    这题使用动态规划来写是最简单的😄!每一个节点都有两个状态,要么是从上节点过来的,要么是从左节点过来的,所以我们可以很容易就得到一个状态转移方程 f ( i , j ) = f ( i , j − 1 ) + f ( i − 1 , j ) f(i,j)=f(i,j-1)+f(i-1,j) f(i,j)=f(i,j1)+f(i1,j),也就是说只要上节点或者左节点能够到达终点,那么当前节点一定能够到达终点(实在不懂的可以画个草图一下就能理解了,这题堪称动态规划入门题了,对新手是分友好🤭)

    在这里插入图片描述

    /**
     * @author ghp
     * @title 不同路径
     */
    class Solution {
    
        public int uniquePaths(int m, int n) {
            int[][] f = new int[m+1][n+1];
            f[1][1] = 1;
            for (int i = 1; i <= m; i++) {
                for (int j = 1; j <= n; j++) {
                    // 这里要用自加,是为了防止f[1][1]为0
                    f[i][j] += f[i - 1][j] + f[i][j - 1];
                }
            }
            return f[m][n];
        }
    }
    
  • 解法三:组合数学

    LeetCode官方提供的代码题解,简洁而优雅。感兴趣的可以去官网查看题解详情分析

    class Solution {
        public int uniquePaths(int m, int n) {
            long ans = 1;
            for (int x = n, y = 1; y < m; ++x, ++y) {
                ans = ans * x / y;
            }
            return (int) ans;
        }
    }
    
    作者:LeetCode-Solution
    链接:https://leetcode.cn/problems/unique-paths/solution/bu-tong-lu-jing-by-leetcode-solution-hzjf/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL中的行级锁

行级锁的类型主要有三类&#xff1a; Record Lock&#xff0c;记录锁&#xff0c;也就是仅仅把一条记录锁上&#xff1b;Gap Lock&#xff0c;间隙锁&#xff0c;锁定一个范围&#xff0c;但是不包含记录本身&#xff0c;只存在于可重复读隔离级别&#xff0c;目的是为了解决可…

前端封装一个移动端(已支持PC)滚动的组件

安装 npm install better-scroll/core --save引入 import BScroll from better-scroll/core直接上代码 Scroll.vue <template><div ref"rootRef"><slot></slot></div> </template><script> import useScroll from ./u…

配置虚拟机(VMware )网络

1、查询 IP ip addr # 命令和ifconfig类似&#xff0c;但前者功能更强大&#xff0c;并旨在取代后者。可以看到两个网卡 lo和ens33&#xff08;lo是本地网卡&#xff09; 2、配置静态IP地址和修改主机名(网络配置使用随机分配免配置) 使用vi编辑器打开ens33网络的配置文件&am…

Windows系统配置Python环境(Anaconda篇)

Windows系统配置Python环境&#xff08;Anaconda篇&#xff09; 一、下载 根据自己电脑系统下载对应的安装包 官方下载地址&#xff1a;https://www.anaconda.com/products/distribution 清华镜像网站&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ …

SpringBoot——动态数据源(多数据源自动切换)

前言 日常的业务开发项目中只会配置一套数据源&#xff0c;如果需要获取其他系统的数据往往是通过调用接口&#xff0c; 或者是通过第三方工具比如kettle将数据同步到自己的数据库中进行访问。 但是也会有需要在项目中引用多数据源的场景。比如如下场景&#xff1a; 自研数据…

更有效的协同程序【插件:More Effective Coroutines】

插件地址&#xff1a;传送门 1、命名空间 using System.Collections.Generic; using MEC; 2、与传统的协程相比 传统&#xff1a;StartCoroutine(_CheckForWin()); 被RunCoroutine取代。必须选择执行循环进程&#xff0c;默认为“Segment.Update”。 using System.Coll…

华为OD机试真题 JavaScript 实现【最优资源分配】【2023Q1 200分】

一、题目描述 某块业务芯片最小容量单位为 1.25G&#xff0c;总容量为 M*1.25G&#xff0c;对该芯片资源编号为 1&#xff0c;2&#xff0c;… M。 该芯片支持 3 种不同的配置&#xff0c;分别为 A、B、C. 配置 A: 占用容量为 1.25 * 1 1.25G配置 B: 占用容量为 1.25* 2 2…

一文了解智能驾驶架构平台ROS2和自适应AUTOSAR之间的区别

公众号致力于点云处理&#xff0c;SLAM&#xff0c;三维视觉&#xff0c;高精地图等领域相关内容的干货分享&#xff0c;欢迎各位加入&#xff0c;有兴趣的可联系dianyunpcl163.com。未经作者允许请勿转载&#xff0c;欢迎各位同学积极分享和交流。 背景介绍 在汽车行业&#x…

有人问高考能改变命运不,老大爷回答是不能

昨天看到一段小视频&#xff0c;问高考能改变命运不&#xff0c;老大爷回答是不能。 我遂想起写写这个话题。 &#xff08;1&#xff09; 成功者的要素到底是什么&#xff1f; 我们中国人经常用&#xff1a;成者为王败者为寇&#xff0c;这句话来形容成功者。 我们见过很多成功…

警惕超声波工艺对晶振造成损伤

超声波技术被广泛应用于工业生产中&#xff0c;常见的超声波工艺有&#xff1a;超声波清洗工艺、焊接工艺。 使用该两种工艺时&#xff0c;超声波仪器通常以20KHz至60KHz的频率运行。 清洗工艺是指清除工件表面上液体或固体的污染物&#xff1b;而焊接工艺中&#xff0c;高频机…

论不同阶段的教育”焦虑“

有了孩子&#xff0c;父母们大体对其教育都会有点焦虑感。焦虑是一种情绪&#xff0c;但这里不分析情绪&#xff0c;而是在文题中加了引号&#xff0c;拆开来讨论下不同阶段教育的焦点与考虑。 学前 教育的焦虑在上小学前就开始了&#xff0c;担心起跑线落后了。德国和美国都做…

直播回顾|走进元服务,携手小强停车探索鸿蒙新流量阵地

本期直播《“元”来如此&#xff0c;“服务”直达——揭秘鸿蒙新流量阵地》聚焦元服务的商业流量价值&#xff0c;介绍元服务提供的服务直达和卡片动态变化等轻量化服务。网约停车旗舰平台小强停车做客直播间&#xff0c;分享小强停车在HarmonyOS生态中&#xff0c;如何通过元服…

数据库信息速递 SQL Server新版本许可证价格上涨了10%

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

STM32单片机蓝牙APP GSM短信安全监控系统湿度烟雾入侵报警系统

实践制作DIY- GC0147---蓝牙APP GSM短信安全监控系统 基于STM32单片机设计---蓝牙APP GSM短信安全监控系统 二、功能介绍&#xff1a; 硬件组成&#xff1a;STM32F103C系列最小系统板 LCD1602显示器DHT11空气湿度传感器MQ2烟雾传感器红外热释电人体检测模块SIM800短信发送模块…

记录--详解 XSS(跨站脚本攻击)

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前言&#xff1a;我们知道同源策略可以隔离各个站点之间的 DOM 交互、页面数据和网络通信&#xff0c;虽然严格的同源策略会带来更多的安全&#xff0c;但是也束缚了 Web。这就需要在安全和自由之间找…

基于短期替代变量的因果效应估计

本篇文章分为&#xff1a; 1.前言 2.模型方案 2.1 替代指数背景 2.2 替代指数的基本设定 2.3 模型结构 3.评估 4.总结与展望 1. 前言 在网约车双边交易市场中&#xff0c;量化策略对平衡市场供需的影响起着重要的作用。对市场供需的影响分为两种情况&#xff1a; 短期价值…

【Linux】Linux环境与历史

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 1.Linux发展史 a.是什么&#xff1f; b.计算机发展(硬件) 硅谷模式: c.操作系统的故事(软件) 计算机软硬件发展史: d.Linux操作系统 2.Linux提炼特征 a.开源 b.更多…

java设计模式之:组合模式

文章目录 1、什么是组合模式&#xff1f;2、组合模式定义3、组合模式通用代码实现4、组合模式优点5、组合模式应用场景 相信树形结构大家都知道&#xff0c;但是你是否知道用到了什么设计模式吗&#xff1f; 1、什么是组合模式&#xff1f; Compose objects into tree structu…

第二章 翻译

第二章 翻译 2010年真题&#xff08;主旨词&#xff1a;sustainability&#xff09; Section Ⅲ Translation Directions: In this section, there is a text in English. Translate it into Chinese. Write your translation on ANSWER SHEET 2. (15points) “Sustainabili…

转转前端周刊第六十九期

转转前端周刊 本刊意在将整理业界精华文章给大家&#xff0c;期望大家一起打开视野 如果你有发现一些精华文章想和更多人分享&#xff0c;可以点击我们的公众号名称&#xff0c;将文章链接和你的解读文案发给我们&#xff01;我们会对内容进行筛选和审核&#xff0c;保留你的推…