【LeetCode每日一题合集】2023.8.28-2023.9.3(到家的最少跳跃次数)

news2024/11/25 11:54:40

文章目录

  • 57. 插入区间
  • 823. 带因子的二叉树
    • 解法——递推
  • 1654. 到家的最少跳跃次数(BFS,🚹最远距离上界的证明)
  • 1761. 一个图中连通三元组的最小度数
  • 2240. 买钢笔和铅笔的方案数
    • 解法1——完全背包
    • 解法2——枚举买了几支钢笔(推荐解法)
  • 2511. 最多可以摧毁的敌人城堡数目
    • 解法——一次遍历
  • 1921. 消灭怪物的最大数量(贪心)

57. 插入区间

https://leetcode.cn/problems/insert-interval/
在这里插入图片描述
提示:
0 <= intervals.length <= 10^4
intervals[i].length == 2
0 <= intervals[i][0] <= intervals[i][1] <= 10^5
intervals 根据 intervals[i][0] 按 升序 排列
newInterval.length == 2
0 <= newInterval[0] <= newInterval[1] <= 10^5

当前区间与要加入的新区间之间的关系只有两种可能:相交或者不相交。

如果相交,将两者结合即可。
如果不相交,判断新加入的区间是否在当前区间之前,如果是,就先加入答案。

遍历一遍之后,如果没有处理过新加入的区间,就说明新区间应该加在最后。

class Solution {
    public int[][] insert(int[][] intervals, int[] newInterval) {
        if (intervals.length == 0) return new int[][]{newInterval};
        List<int[]> ans = new ArrayList<>();
        int s = newInterval[0], e = newInterval[1];
        boolean f = false;
        for (int[] interval: intervals) {
            int a = interval[0], b = interval[1];
            // 和 newInterval 相交
            if (b >= s && a <= e) {
                f = true;
                a = Math.min(a, s);
                b = Math.max(b, e);
            }

            // 不相交 newInterval 在此区间之前
            if (a > e) {
                 if (ans.size() == 0 || ans.get(ans.size() - 1)[1] < s) {
                    ans.add(newInterval);
                    f = true;
                }
            }

            if (ans.size() == 0 || ans.get(ans.size() - 1)[1] < a) ans.add(new int[]{a, b});
            else ans.get(ans.size() - 1)[1] = b;
        }
        // 如果没有处理过 newInterval
        if (!f) ans.add(newInterval);
        return ans.toArray(new int[ans.size()][2]);
    }
}

823. 带因子的二叉树

https://leetcode.cn/problems/binary-trees-with-factors/
在这里插入图片描述
提示:
1 <= arr.length <= 1000
2 <= arr[i] <= 10^9
arr 中的所有值 互不相同

解法——递推

将元素排序之后,从小到大依次处理各个数值作为根节点时的二叉树数量。

class Solution {
    final long MOD = (long)1e9 + 7;

    public int numFactoredBinaryTrees(int[] arr) {
        Arrays.sort(arr);
        int n = arr.length;
        long ans = 0;
        Map<Integer, Long> m = new HashMap<>();         // 存储每个数字作为根节点时的二叉树数量
        for (int i = 0; i < n; ++i) {
            long cnt = 1;
            for (int j = 0; j < i; ++j) {               // 枚举儿子节点
                if (arr[i] % arr[j] == 0 && m.containsKey(arr[i] / arr[j])) {
                    cnt = (cnt + m.get(arr[j]) * m.get(arr[i] / arr[j])) % MOD;
                }
            }
            ans = (ans + cnt) % MOD;
            m.put(arr[i], cnt);
        }
        return (int)ans;
    }
}

1654. 到家的最少跳跃次数(BFS,🚹最远距离上界的证明)

https://leetcode.cn/problems/minimum-jumps-to-reach-home/description/
在这里插入图片描述

提示:
1 <= forbidden.length <= 1000
1 <= a, b, forbidden[i] <= 2000
0 <= x <= 2000
forbidden 中所有位置互不相同。
位置 x 不在 forbidden 中。

可以证明,一定可以在[0, max(f + a + b, x + b)] 的下标范围内找到最优解,其中 f 是最远进制点的坐标。
因为 f, a, b, x <= 2000,故搜索范围不会超过 6000。(证明略,我也没整明白)

用 bfs 计算最短路。

class Solution {
    public int minimumJumps(int[] forbidden, int a, int b, int x) {
        Set<Integer> s = new HashSet<>();
        for (int v: forbidden) s.add(v);
        Deque<int[]> q = new ArrayDeque<>();
        q.offer(new int[]{0, 1});       // 将起点放入队列
        final int N = 6000;
        boolean[][] vis = new boolean[N][2];
        vis[0][1] = true;
        for (int ans = 0; !q.isEmpty(); ++ans) {
            for (int t = q.size(); t > 0; --t) {
                int[] p = q.poll();
                int i = p[0], k = p[1];
                // 到达了目的地,直接返回答案
                if (i == x) return ans;

                List<int[]> nxt = new ArrayList<>();
                nxt.add(new int[]{i + a, 1});
                // 如果上一步 不是向后跳,那么这一步可以向后跳
                if ((k & 1) == 1) nxt.add(new int[]{i - b, 0});
                for (int[] e: nxt) {
                    int j = e[0];
                    k = e[1];
                    if (j >= 0 && j < N && !s.contains(j) && !vis[j][k]) {
                        q.offer(new int[]{j, k});
                        vis[j][k] = true;
                    }
                }
            }
        }
        return -1;
    }
}

1761. 一个图中连通三元组的最小度数

https://leetcode.cn/problems/minimum-degree-of-a-connected-trio-in-a-graph/

在这里插入图片描述

提示:
2 <= n <= 400
edges[i].length == 2
1 <= edges.length <= n * (n-1) / 2
1 <= ui, vi <= n
ui != vi
图中没有重复的边。

构造邻接表,枚举每一个三元组。

class Solution {
    public int minTrioDegree(int n, int[][] edges) {
        int[] cnt = new int[n + 1];
        int[][] isC = new int[n + 1][n + 1];
        for (int[] edge: edges) {
            int x = edge[0], y = edge[1];
            isC[x][y] = 1;
            isC[y][x] = 1;
            cnt[x]++;
            cnt[y]++;
        }
        int ans = Integer.MAX_VALUE;
        for (int i = 1; i <= n; ++i) {
            for (int j = i + 1; j <= n; ++j) {
                if (isC[i][j] == 0) continue;
                for (int k = j + 1; k <= n; ++k) {
                    if (isC[j][k] == 0 || isC[i][k] == 0) continue;
                    ans = Math.min(ans, cnt[i] + cnt[j] + cnt[k] - 6);
                }
            }
        }
        return ans != Integer.MAX_VALUE? ans: -1;
    }
}

2240. 买钢笔和铅笔的方案数

https://leetcode.cn/problems/number-of-ways-to-buy-pens-and-pencils/

在这里插入图片描述

提示:
1 <= total, cost1, cost2 <= 10^6

解法1——完全背包

套用完全背包模板,对dp数组求和即可。

class Solution {
    public long waysToBuyPensPencils(int total, int cost1, int cost2) {
        long[] dp = new long[total + 1];
        dp[0] = 1;
        for (int j = cost1; j <= total; ++j) dp[j] += dp[j - cost1];
        for (int j = cost2; j <= total; ++j) dp[j] += dp[j - cost2];
        long ans = 0;
        for (long d: dp) ans += d;
        return ans;
    }
}

解法2——枚举买了几支钢笔(推荐解法)

通过枚举购买钢笔的数量,计算此时可以购买铅笔的数量,+1即是购买此时数量钢笔时,购买铅笔的方案数。

class Solution {
    public long waysToBuyPensPencils(int total, int cost1, int cost2) {
        long ans = 0;
        for (int i = 0; i * cost1 <= total; ++i) {
            ans += (total - i * cost1) / cost2 + 1;
        }
        return ans;
    }
}

2511. 最多可以摧毁的敌人城堡数目

https://leetcode.cn/problems/maximum-enemy-forts-that-can-be-captured/?envType=daily-question&envId=2023-09-02

在这里插入图片描述

提示:
1 <= forts.length <= 1000
-1 <= forts[i] <= 1

解法——一次遍历

题目要求是计算 1 和 -1 之间的 0 的最大数量。

一次遍历,遍历的过程中记录上一个 1 或 -1 出现的位置即可。

class Solution {
    public int captureForts(int[] forts) {
        int lastId = 0, ans = 0;
        for (int i = 0; i < forts.length; ++i) {
            if (forts[i] == -1 || forts[i] == 1) {
                if (forts[i] + forts[lastId] == 0) ans = Math.max(ans, i - lastId - 1);
                lastId = i;
            }
        }
        return ans;
    }
}

1921. 消灭怪物的最大数量(贪心)

https://leetcode.cn/problems/eliminate-maximum-number-of-monsters/

在这里插入图片描述

提示:
n == dist.length == speed.length
1 <= n <= 10^5
1 <= dist[i], speed[i] <= 10^5

先计算时间,再按时间排序。
贪心的先消灭快要到达城市的怪兽。

class Solution {
    public int eliminateMaximum(int[] dist, int[] speed) {
        int n = dist.length;
        int[] t = new int[n];
        for (int i = 0; i < n; ++i) {
            t[i] = (dist[i] + speed[i] - 1) / speed[i]; // 向上取整
        }
        Arrays.sort(t);
        for (int i = 0; i < n; ++i) {
            if (t[i] <= i) return i;
        }
        return n;
    }
}

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

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

相关文章

华为云云服务器评测|使用云耀云服务器L实例部署Portainer工具

华为云云服务器评测&#xff5c;使用云耀云服务器L实例部署Portainer工具 一、云耀云服务器L实例介绍1.1 云耀云服务器L实例简介1.2 云耀云服务器L实例特点1.3 云耀云服务器L实例使用场景 二、本次实践介绍2.1 本次实践简介2.2 Portainer简介 三、购买云耀云服务器L实例3.1 登录…

java八股文面试[数据库]——主键的类型自增还是UUID

auto_increment的优点&#xff1a; 字段长度较uuid小很多&#xff0c;可以是bigint甚至是int类型&#xff0c;这对检索的性能会有所影响。 在写的方面&#xff0c;因为是自增的&#xff0c;所以主键是趋势自增的&#xff0c;也就是说新增的数据永远在后面&#xff0c;这点对于…

QT—基于http协议的网络文件下载

1.常用到的类 QNetworkAccessManager类用于协调网络操作&#xff0c;负责发送网络请求&#xff0c;创建网络响应 QNetworkReply类表示网络请求的响应。在QNetworkAccessManager发送一个网络请求后创建一个网络响应。它提供了以下信号&#xff1a; finished()&#xff1a;完成…

Rider 中C#单元测试

使用NUnit.Framework这个包&#xff0c;没有的话可以用nuget去搜索下载。简单的进行单元测试&#xff0c;想要单元测试好像还给需要static函数&#xff0c;慢慢学学C# using System; using NUnit.Framework;namespace client {public class test{[Test]public static void test…

(二十二)大数据实战——Flume数据采集之故障转移案例实战

前言 本节内容我们完成Flume数据采集的故障转移案例&#xff0c;使用三台服务器&#xff0c;一台服务器负责采集nc数据&#xff0c;通过使用failover模式的Sink处理器完成监控数据的故障转移&#xff0c;使用Avro的方式完成flume之间采集数据的传输。整体架构如下&#xff1a;…

纯css实现奥运五环、3D平移与旋转

文章目录 前言效果图htmlcss 前言 1、不是真正的五环&#xff0c;因为通过形变得来。 2、不同电脑显示器的像素不同&#xff0c;显现的效果不同。 3、不推荐使用此方法。 4、主要通过旋转加平移的方式实现。 效果图 html <div class"olympic_rings"><span …

pt23django教程

Django的框架设计模式 MVC 设计模式 MVC 代表 Model-View-Controller&#xff08;模型-视图-控制器&#xff09; 模式。作用: **降低模块间的耦合度**(解耦) - M 模型层(Model), 主要用于对数据库层的封装 - V 视图层(View), 用于向用户展示结果 - C 控制(Controller &#x…

达梦数据库和mysql数据库获取两个坐标之间的距离

91、达梦数据库和mysql数据库获取两个坐标之间的距离 参考&#xff1a;参考 mysql 数据库&#xff1a; select st_distance_sphere(POINT(经度1,纬度1), POINT(经度2,纬度2))达梦数据库没有内置函数&#xff0c;需要自己手动创建函数 CREATE OR REPLACE FUNCTION "模式…

自然语言处理 微调ChatGLM-6B大模型

自然语言处理 微调ChatGLM-6B大模型 1、GLM设计原理2、大模型微调原理1、P-tuning v2方案2、LORA方案 1、GLM设计原理 bert的主要任务是随机的去除掉某个单词&#xff0c;使用上下文将其预测出来&#xff08;相当于完形填空任务&#xff09;&#xff1b; GPT的主要任务是根据前…

【精品】NLP自然语言处理学习路线(知识体系)

当前&#xff0c;大规模预训练语言模型的强大对话问答、文本生成能力&#xff0c;将自然语言处理&#xff08;NLP&#xff09;的研究和应用推向了新一轮的热潮。NLP是计算机科学、人工智能和语言学等学科交叉的前沿领域。NLP的应用和研究范围非常的广泛&#xff0c;个人是没有找…

react-grapesjs——开源代码学习与修改(初出茅庐)

文章目录 ⭐前言⭐grapesjs初始化过程&#x1f496; 渲染大体流程&#x1f496; Editor对象 创建&#x1f496; EditorModel 对象创建&#x1f496; load modules 加载定义的目录模块Module&#x1f496; StyleManager渲染过程 ⭐修改grapesjs配置项⭐总结⭐ 如何修改开源代码⭐…

英诺森 “供应链智能数据平台”荣获“科技进步奖”

近日&#xff0c;2023年中国物流与采购联合会科学技术奖正式公布&#xff0c;该奖项经国家科技部批准&#xff0c;在国家科学技术奖励工作办公室登记备案&#xff0c;是我国物流行业最具影响力的奖项之一。 英诺森联合客户申报的科技项目“英诺森供应链智能数据平台”&#xf…

如何查找GNU C语言参考手册

快捷通道 标准C/C参考手册 GNU C参考手册HTML版 GNU C参考手册PDF版本 HTML版本部分目录预览 从GNU官网找那个GNU C参考手册 访问gnu.org 点击软件 下滑找到gnu-c-manual或者在这个页面Ctrl-f搜索"manual" 点进去即可看到HTML版本和PDF版本

slog实战:文件日志、轮转与kafka集成

《slog正式版来了&#xff1a;Go日志记录新选择&#xff01;[1]》一文发布后&#xff0c;收到了很多读者的反馈&#xff0c;意见集中在以下几点&#xff1a; 基于slog如何将日志写入文件slog是否支持log轮转(rotation)&#xff0c;如果slog不支持&#xff0c;是否有好的log轮转…

【力扣每日一题05】数组篇--加一

一、题目 给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外&#xff0c;这个整数不会以零开头。 示例 1&#xff1a; 输入&#xff1…

Codeforces Round 806 (Div. 4) D 字符串

题目链接&#xff1a;Codeforces Round 806 (Div. 4) D 给你长度最多为 8的 n个字符串 s1,s2,…,sn。 对于每个字符串 si&#xff0c;判断是否存在两个字符串 sj和 sk&#xff0c;使得 sisjsk。也就是说&#xff0c;si&#xfffd;&#xfffd;是sj&#xfffd;&#xfffd;和…

「网页开发|前端开发|Vue」05 Vue实战:从零到一实现一个网站导航栏

本文主要介绍如何从最开始的草图&#xff0c;通过确定基本结构、修改元素布局、美化外观来实现一个网站导航栏&#xff0c;从而熟悉网页开发的基本流程。同时&#xff0c;我们会把性能、规范性、可维护性方面的代码优化也考虑其中。 文章目录 本系列前文传送门一、场景说明&am…

【LeetCode】双指针求解和为s的两个数字

Problem: 剑指 Offer 57. 和为s的两个数字 文章目录 题目解析算法思路分析复杂度Code 题目解析 首先来讲解一下本题的思路 我们看到本题的意思很简单&#xff0c;就是去这个nums这个数组中进行寻找&#xff0c;如果找到了两个数相加之和为target的话&#xff0c;那构成一个结果…

C++11新特性① | C++11 常用关键字实战详解

目录 1、引言 2、C11 新增关键字详解 2.1、auto 2.2、override 2.3、final 2.4、nullptr 2.5、使用delete阻止拷贝类对象 2.6、decltype 2.7、noexcept 2.8、constexpr 2.9、static_assert VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xf…

网络协议从入门到底层原理学习(二)—— Mac地址/IP地址

文章目录 网络协议从入门到底层原理学习&#xff08;二&#xff09;—— Mac地址/IP地址1、MAC地址2、MAC地址的表示格式3、MAC地址表4、MAC地址操作5、MAC地址的获取6、ARP7、ICMP8、IP地址9、IP地址的分类和格式10、不同分类的IP地址的范围11、特殊 IP 地址12、子网掩码13、子…