【LeetCode每日一题合集】2023.8.21-2023.8.27(统计点对的数目)

news2024/12/24 21:12:57

文章目录

  • 2337. 移动片段得到字符串⭐
    • 解法——脑筋急转弯
  • 849. 到最近的人的最大距离
  • 1782. 统计点对的数目🚹🚹🚹🚹🚹
    • 解法——从双指针到终极优化
      • 单独处理每个询问
      • 终极优化TODO
    • 技巧总结
      • 用一个int存储两个不超过 65535 的数
  • 1267. 统计参与通信的服务器
    • 解法——两次循环+计数数组
  • 1448. 统计二叉树中好节点的数目
    • 代码1
    • 代码2
  • 228. 汇总区间
    • 分组循环,一次遍历
    • 分组循环相关题目列表(🐂模板)
      • 1446. 连续字符
      • 1869. 哪种连续子字符串更长
      • 1957. 删除字符使字符串变好
      • 2038. 如果相邻两个颜色均相同则删除当前颜色
  • 56. 合并区间

2337. 移动片段得到字符串⭐

https://leetcode.cn/problems/move-pieces-to-obtain-a-string/

在这里插入图片描述
提示:
n == start.length == target.length
1 <= n <= 10^5
start 和 target 由字符 'L'、'R' 和 '_' 组成

解法——脑筋急转弯

https://leetcode.cn/problems/move-pieces-to-obtain-a-string/solutions/1658923/nao-jin-ji-zhuan-wan-pythonjavacgo-by-en-9sqt/
在这里插入图片描述

class Solution {
    public boolean canChange(String start, String target) {
        int n = start.length();
        for (int i = 0, j = 0; i < n || j < n; ++i, ++j) {
            while (i < n && start.charAt(i) == '_') ++i;
            while (j < n && target.charAt(j) == '_') ++j;

            if (i < n && j < n) {
                if (start.charAt(i) != target.charAt(j)) return false;		// 不相等
                else if (start.charAt(i) == 'L' && i < j) return false;		// L不能往右移动
                else if (start.charAt(i) == 'R' && i > j) return false;		// R不能往左移动
            } else if (i < n || j < n) return false;						// 没匹配完
        }
        return true;
    }
}

849. 到最近的人的最大距离

https://leetcode.cn/problems/maximize-distance-to-closest-person/
在这里插入图片描述
提示:
2 <= seats.length <= 2 * 10^4
seats[i] 为 0 或 1
至少有一个 空座位
至少有一个 座位上有人

分为三种情况:

  1. 坐在两个人之间
  2. 坐在最右侧
  3. 坐在最左侧
class Solution {
    public int maxDistToClosest(int[] seats) {
        int n = seats.length, ans = 0, last = -1;   // last记录上一个有人的位置
        for (int i = 0; i < n; ++i) {
            if (seats[i] == 1) {
                if (last != -1) ans = Math.max(ans, (i - last) / 2);    // 求d
                else ans = Math.max(ans, i);        // 出现了第一个有人的位置
                last = i;
            }
        }
        return Math.max(ans, n - 1 - last);         // 计算放在最后一个位置时的距离
    }
}

1782. 统计点对的数目🚹🚹🚹🚹🚹

https://leetcode.cn/problems/count-pairs-of-nodes/

在这里插入图片描述
提示:
2 <= n <= 2 * 10^4
1 <= edges.length <= 10^5
1 <= ui, vi <= n
ui != vi
1 <= queries.length <= 20
0 <= queries[j] < edges.length

解法——从双指针到终极优化

https://leetcode.cn/problems/count-pairs-of-nodes/solutions/2400682/ji-bai-100cong-shuang-zhi-zhen-dao-zhong-yhze/

单独处理每个询问

int[] deg 存一下与每个点相连的边的数量。
HashMap<> cntE存一下每种边出现的次数。

参考 167. 两数之和 II - 输入有序数组 的思路,将 deg 排序,然后双指针计算满足的点对数。
最后检查 cntE 中多被计算的边数,减去之后就是 ans[j]。

在这里插入图片描述
最后这句 deg[x] + deg[y] - c <= queries[j] 的原因是,x 和 y 之间有 c 条边,这 c 条边都贡献在了 deg[x] 和 deg[y] 之中,所以就多算了 c 次。
把多算的 c 次去掉之后,如果不满足了,那这个点对(x,y)也就不是满足要求的了。将 ans[j] 减 1。

class Solution {
    public int[] countPairs(int n, int[][] edges, int[] queries) {
        int[] deg = new int[n + 1];     // 表示与 i 相连的边的数目
        Map<Integer, Integer> cntE = new HashMap<>();   // 记录每种边出现的次数
        for (int[] e: edges) {
            int x = e[0], y = e[1];
            deg[x]++;
            deg[y]++;

            // 用一个int存储两个不超过 65535 的数
            if (x > y) {        // 让 x 是更小的数,y 是更大的数
                int t = x;
                x = y;
                y = t;
            }
            cntE.merge(x << 16 | y, 1, Integer::sum);
        }

        int m = queries.length;
        int[] ans = new int[m];
        int[] sortedDeg = deg.clone();
        Arrays.sort(sortedDeg);
        for (int j = 0; j < m; ++j) {
            int q = queries[j];
            int l = 1, r = n;
            // 使用双指针计算ans[j]
            while (l < r) {
                if (sortedDeg[l] + sortedDeg[r] <= q) {
                    // 不满足要求,右移左指针
                    l++;
                } else {
                    // 从l+1,...,r都可以和l配对,左移右指针
                    ans[j] += r - l;
                    r--;
                }
            }
            // 去掉多计算的点对
            for (Map.Entry<Integer, Integer> e: cntE.entrySet()) {
                int k = e.getKey(), c = e.getValue();
                int s = deg[k >> 16] + deg[k & 0xffff];     // 取出k的高16位和低16位
                if (s > q && s - c <= q) {
                    // 这是多计算的点对,将 ans[j] 减一
                    ans[j]--;
                }
            }
        }
        return ans;
    }
}

终极优化TODO

脑子不够用了,咱先不优化。

在这里插入代码片

技巧总结

用一个int存储两个不超过 65535 的数

存储

cntE.merge(x << 16 | y, 1, Integer::sum);

取出

int s = deg[k >> 16] + deg[k & 0xffff];     // 取出k的高16位和低16位

1267. 统计参与通信的服务器

https://leetcode.cn/problems/count-servers-that-communicate/
在这里插入图片描述
提示:
m == grid.length
n == grid[i].length
1 <= m <= 250
1 <= n <= 250
grid[i][j] == 0 or 1

解法——两次循环+计数数组

class Solution {
    public int countServers(int[][] grid) {
        int m = grid.length, n = grid[0].length;
        int ans = 0;
        int[] row = new int[m], col = new int[n];
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (grid[i][j] == 1) {
                    row[i]++;
                    col[j]++;
                }
            }
        }
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (grid[i][j] == 1 && (row[i] > 1 || col[j] > 1)) ++ans;
            }
        }
        return ans;
    }
}

1448. 统计二叉树中好节点的数目

https://leetcode.cn/problems/count-good-nodes-in-binary-tree/

在这里插入图片描述
提示:
二叉树中节点数目范围是 [1, 10^5] 。
每个节点权值的范围是 [-10^4, 10^4] 。

代码1

class Solution {
    int ans = 0;

    public int goodNodes(TreeNode root) {
        dfs(root, Integer.MIN_VALUE);
        return ans;
    }

    public void dfs(TreeNode root, int mx) {
        if (root == null) return;
        if (root.val >= mx) {
            ++ans;
            mx = root.val;
        }
        dfs(root.left, mx);
        dfs(root.right, mx);
    }
}

代码2

class Solution {
    public int goodNodes(TreeNode root) {
        return dfs(root, Integer.MIN_VALUE);
    }

    public int dfs(TreeNode root, int mx) {
        int res = 0;
        if (root == null) return res;
        if (root.val >= mx) {
            ++res;
            mx = root.val;
        }
        res += dfs(root.left, mx) + dfs(root.right, mx);
        return res;
    }
}

228. 汇总区间

https://leetcode.cn/problems/summary-ranges/description/
在这里插入图片描述
提示:
0 <= nums.length <= 20
-2^31 <= nums[i] <= 2^31 - 1
nums 中的所有值都 互不相同
nums 按升序排列

分组循环,一次遍历

class Solution {
    public List<String> summaryRanges(int[] nums) {
        List<String> ans = new ArrayList<>();
        for (int i = 0; i < nums.length; ++i) {
            int j = i;
            while (j + 1 < nums.length && nums[j + 1] == nums[j] + 1) j++;
            if (j == i) ans.add(Integer.toString(nums[i]));
            else ans.add(nums[i] + "->" + nums[j]);
            i = j;
        }
        return ans;
    }
}

分组循环相关题目列表(🐂模板)

题目列表来自:https://leetcode.cn/problems/summary-ranges/solutions/553645/hui-zong-qu-jian-by-leetcode-solution-6zrs/comments/2106748

一般来说,分组循环的模板如下(根据题目调整):

i, n = 0, len(nums)
while i < n:
    start = i
    while i < n and ...:
        i += 1
    # 从 start 到 i-1 是一段
    # 下一段从 i 开始,无需 i+=1

也就是每次记录一下 start,继续用 while 枚举 i。

1446. 连续字符

https://leetcode.cn/problems/consecutive-characters/
在这里插入图片描述

提示:
1 <= s.length <= 500
s 只包含小写英文字母。

class Solution {
    public int maxPower(String s) {
        int ans = 0;
        for (int i = 0; i < s.length(); ++i) {
            int start = i;
            while (i + 1 < s.length() && s.charAt(i + 1) == s.charAt(i)) i++;
            ans = Math.max(ans, i - start + 1);
        }
        return ans;
    }
}

1869. 哪种连续子字符串更长

https://leetcode.cn/problems/longer-contiguous-segments-of-ones-than-zeros/
在这里插入图片描述
提示:
1 <= s.length <= 100
s[i] 不是 '0' 就是 '1'

class Solution {
    public boolean checkZeroOnes(String s) {
        int l0 = 0, l1 = 0, n = s.length();
        for (int i = 0; i < n; ++i) {
            int start = i;
            while (i + 1 < n && s.charAt(i) == s.charAt(i + 1)) ++i;
            if (s.charAt(start) == '0') l0 = Math.max(l0, i - start + 1);
            if (s.charAt(start) == '1') l1 = Math.max(l1, i - start + 1);
        }
        return l1 > l0;
    }
}

1957. 删除字符使字符串变好

https://leetcode.cn/problems/delete-characters-to-make-fancy-string/
在这里插入图片描述
提示:
1 <= s.length <= 10^5
s 只包含小写英文字母。

class Solution {
    public String makeFancyString(String s) {
        StringBuilder ans = new StringBuilder();
        int n = s.length();
        for (int i = 0; i < n; ++i) {
            int start = i;
            while (i + 1 < n && s.charAt(i + 1) == s.charAt(i)) ++i;
            if (i - start + 1 >= 3) ans.append(s.substring(start, start + 2));
            else ans.append(s.substring(start, i + 1));
        }
        return ans.toString();
    }
}

2038. 如果相邻两个颜色均相同则删除当前颜色

https://leetcode.cn/problems/remove-colored-pieces-if-both-neighbors-are-the-same-color/

在这里插入图片描述

提示:
1 <= colors.length <= 10^5
colors 只包含字母 'A' 和 'B'

class Solution {
    public boolean winnerOfGame(String colors) {
        int a = 0, b = 0, n = colors.length();
        for (int i = 0; i < n; ++i) {
            int start = i;
            while (i + 1 < n && colors.charAt(i + 1) == colors.charAt(i)) i++;
            if (colors.charAt(start) == 'A') a += Math.max(i - start - 1, 0);
            if (colors.charAt(start) == 'B') b += Math.max(i - start - 1, 0);
        }
        return a > b;
    }
}

56. 合并区间

https://leetcode.cn/problems/merge-intervals/
在这里插入图片描述
提示:
1 <= intervals.length <= 10^4
intervals[i].length == 2
0 <= starti <= endi <= 10^4

class Solution {
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
        List<int[]> ans = new ArrayList<>();
        for (int i = 0; i < intervals.length; ++i) {
            if (ans.size() == 0 || intervals[i][0] > ans.get(ans.size() - 1)[1]) ans.add(intervals[i]);
            else ans.get(ans.size() - 1)[1] = Math.max(intervals[i][1], ans.get(ans.size() - 1)[1]);
        }
        return ans.toArray(new int[ans.size()][2]);
    }
}

更多相关题目可见:【算法】区间合并类题目总结

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

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

相关文章

最全数据脱敏标准汇编,有必要了解一下!(附下载)

《网络安全法》第四十二条&#xff1a;网络运营者不得泄露、篡改、毁损其收集的个人信息&#xff1b;未经被收集者同意&#xff0c;不得向他人提供个人信息。但是&#xff0c;经过处理无法识别特定个人且不能复原的除外。 《数据安全法》第二十七条&#xff1a;开展数据处理活动…

W5100S_EVB_PICO 做MQTT测试(十二)

前言 上一章我们用W5100S_EVB_PICO 开发板做Ping测试&#xff0c;那么本章我们进行W5100S_EVB_PICO MQTT的测试。 什么是mqtt&#xff1f; MQTT&#xff08;Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于发布/订…

Linux xargs命令继续学习

之前学习过Linux xargs&#xff0c;对此非常的不熟悉&#xff0c;下面继续学习一下&#xff1b; xargs 可以将管道或标准输入&#xff08;stdin&#xff09;数据转换成命令行参数&#xff0c;也能够从文件的输出中读取数据&#xff1b; xargs也可以给命令传递参数&#xff1b;…

【Linux】地址空间概念

目录 前言&#xff1a; 地址空间回顾 验证&#xff1a;一个变量是否会有两个值&#xff1f; 一. 什么是地址空间 虚拟地址与物理地址之间的关系 二. 地址空间是如何设计的 1. 回答一个变量两个值 2.扩展 继续深入理解 三. 为什么要有地址空间 原因&#xff1a; 1. 使…

触摸屏与多台 PLC之间无线Ethernet通信

在实际系统中&#xff0c;同一个车间里分布多台PLC&#xff0c;由触摸屏集中控制。通常所有设备距离在几十米到上百米不等。在有通讯需求的时候&#xff0c;如果布线的话&#xff0c;工程量较大且不美观&#xff0c;这种情况下比较适合采用无线通信方式。本方案以威纶通触摸屏和…

解决解析maven依赖加载卡住问题

首先找到用户设置文件的位置&#xff1a; 根据位置查找文件&#xff0c;没有则创建。 修改maven的默认镜像为阿里云镜像。 <mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/pub…

直播进入新风口:XR虚拟直播市场火爆,未来发展势不可挡

&#xfeff; 近年来&#xff0c;直播行业随着技术的不断发展&#xff0c;呈现出了蓬勃的发展态势。在这个竞争日益激烈的直播行业中&#xff0c;XR虚拟直播成为了最新的风口。XR虚拟直播是一种新型的直播形式&#xff0c;通过虚拟现实技术&#xff0c;让用户置身于直播现场&a…

使用生成式 AI 增强亚马逊云科技智能文档处理

数据分类、提取和分析对于处理大量文档的组织来说可能具有挑战性。传统的文档处理解决方案是手动的、昂贵的、容易出错的,并且难以扩展。利用 Amazon Textract 等 AI 服务,亚马逊云科技智能文档处理(IDP)允许您利用业界领先的机器学习(ML)技术来快速准确地处理任何扫描文档或图…

MySQL 枚举类型如何定义比较好 tinyint?enum?varchar?

enum介绍 先来介绍一下enum类型吧。 ENUM 是一个字符串对象&#xff0c;其值通常选自一个允许值列表中&#xff0c;该列表在表创建时的列规格说明中被明确地列举。&#xff08;建表的时候写到建表语句里&#xff09; 虽然表面是字符串值&#xff0c;但其内部是数字索引&…

Nvidia vpi2 不是最新版本问题

问题&#xff1a; 根据官方手册&#xff1a;VPI - Vision Programming Interface: Installation安装的vpi2有可能不是最新版本&#xff0c;主要原因是手册中的添加的源不是最新的。 解决方法&#xff1a; 在 Index网址中搜索 vpi&#xff0c;如下 可以看到&#xff0c;最新的…

【数字通信原理】笔记(持续更新ing)

通信原理学习笔记&#xff0c;课程见b站: 由于教材不同&#xff0c;我们的课程使用的是《数字通信原理》主编:李白萍 版本&#xff0c;因此此笔记以我们的教材为主整理up主的笔记。 详情见:通信原理 文章目录 第一章 绪论1. 通信的基本概念2. 信息的量度3. 通信系统的性能指标 …

Mars3d图层树//图层管理加载时设置默认折叠的状态

问题&#xff1a;Mars3d图层树//图层管理加载时设置默认折叠的状态。 设置参考&#xff1a; 有个参数 open:false&#xff0c;写在对应的图层配置下&#xff0c;比如某个节点不展示&#xff0c;就对这个节点配置下。 如果全局&#xff0c;可以搜下这个widget内的代码&#xff…

YOLO目标检测——赛马数据集下载分享

目标检测赛马数据集在马匹竞赛、马匹健康监测、马匹行为研究、马匹安全监控和马匹图像检索等应用场景中具有广泛的应用潜力&#xff0c;可以为马匹产业的发展和管理提供有力支持 数据集点击下载&#xff1a;YOLO赛马数据集640图片标框.rar 更多数据集下载和效果展示&#x…

Nature Medicine:GWAS揭示抑郁症与其他精神疾病风险之间的关联

几乎五分之一的丹麦人在一生中经历过抑郁症。奥尔胡斯大学的一项新研究现在表明&#xff0c;抑郁症的遗传风险与其他精神病诊断的遗传风险增加相关。这项研究于2023年7月18日发表在《Nature Medicine》&#xff08;IF202282.9&#xff09;杂志上。 研究人员分析了130万人&#…

高光谱图像超分辨率-总

高光谱图像超分辨率 高光谱图像超分辨率 高光谱图像超分辨率一、基础内容1.1 高光谱图像特点1.2 研究现状1.3 高光谱图像数据集1.4 评价指标1.5 Wald**协议**二、文献阅读清单2.1 综述+先锋工作1.提出解混的思想。2.随机混合模型在高光谱分辨率增强中的应用。3.遥感中的多光谱和…

MySQL基础(六)流程控制、游标、触发器、窗口函数

目录 定义条件与处理程序 定义条件 定义处理程序 流程控制 IF 分支结构之 CASE 循环结构之LOOP 循环结构之WHILE 循环结构之REPEAT 跳转语句leave和iterate 游标 使用游标步骤 全局变量的持久化 触发器 触发器的使用 查看触发器 删除触发器 定义条件与处理程序 …

基于 LLM 的知识图谱另类实践

本文整理自社区用户陈卓见在「夜谈 LLM」主题分享上的演讲&#xff0c;主要包括以下内容&#xff1a; 利用大模型构建知识图谱利用大模型操作结构化数据利用大模型使用工具 利用大模型构建知识图谱 上图是之前&#xff0c;我基于大语言模型构建知识图谱的成品图&#xff0c;主…

【Java从0到1学习】14 Java多线程

1. 多线程概述 人们在日常生活中&#xff0c;很多事情都是可以同时进行的。例如&#xff0c;一个人可以一边听音乐&#xff0c;一边打扫房间&#xff0c;可以一边吃饭&#xff0c;一边看电视。在使用计算机时&#xff0c;很多任务也是可以同时进行的。例如&#xff0c;可以一边…

Android逆向学习(番外一)smali2java部分文件无法反编译的bug与修复方法

Android逆向学习&#xff08;番外一&#xff09;smali2java部分文件无法反编译的bug与修复方法 一、前言 昨天我和往常一样准备着android逆向&#xff08;四&#xff09;的博客&#xff0c;结果发现smali2java对某些文件无法进行逆向&#xff0c;我不知道windows会不会产生这…

安全运营中心(SOC)技术框架

2018年曾经画过一个安全运营体系框架&#xff0c;基本思路是在基础单点技术防护体系基础上&#xff0c;围绕着动态防御、深度分析、实时检测&#xff0c;建立安全运营大数据分析平台&#xff0c;可以算作是解决方案产品的思路。 依据这个体系框架&#xff0c;当时写了《基于主动…