当前位置:首页 > 技术 > 正文内容

LeetCode 周赛第164场题解

访客 技术 2026年7月25日 2

访问所有点的最短耗时

在二维平面上给定一系列点,需要按顺序访问每个点。每一步允许向上下左右或对角线方向移动一格。目标是计算从第一个点开始,依次到达其余各点所需的最少步数。

关键观察在于:两点之间的最小移动次数等于它们横纵坐标差值的最大值,即切比雪夫距离。这是因为对角线移动可以同时改变两个坐标,因此总步数由较长的那个轴向距离决定。

class Solution {
public:
    int minTimeToVisitAllPoints(vector<vector<int>>& path) {
        int totalSteps = 0;
        for (int i = 1; i < path.size(); ++i) {
            int deltaX = abs(path[i][0] - path[i-1][0]);
            int deltaY = abs(path[i][1] - path[i-1][1]);
            totalSteps += max(deltaX, deltaY);
        }
        return totalSteps;
    }
};

可通信服务器数量统计

给定一个二维网格表示服务器分布(1 表示有服务器,0 表示空位),若某台服务器所在的行或列中存在其他至少一台服务器,则该服务器能够参与通信。任务是统计所有能通信的服务器总数。

解决方案分为两步:首先遍历整个网格,记录每一行和每一列的服务器数量;然后再次遍历,检查每台服务器是否满足其所在行或列的计数大于1。

class Solution {
public:
    int countServers(vector<vector<int>>& network) {
        int rows = network.size(), cols = network[0].size();
        vector<int> rowCount(rows, 0), colCount(cols, 0);

        // 统计每行每列的服务器数量
        for (int i = 0; i < rows; ++i) {
            for (int j = 0; j < cols; ++j) {
                if (network[i][j]) {
                    rowCount[i]++;
                    colCount[j]++;
                }
            }
        }

        int connected = 0;
        for (int i = 0; i < rows; ++i) {
            for (int j = 0; j < cols; ++j) {
                if (network[i][j] && (rowCount[i] > 1 || colCount[j] > 1)) {
                    connected++;
                }
            }
        }
        return connected;
    }
};

商品搜索建议系统

实现一个推荐系统,用户输入字符过程中,每次输入后返回字典序前三个以当前输入为前缀的商品名称。

先将商品列表排序,利用双指针维护当前匹配的字符串区间。随着输入字符逐步增加,不断缩小这个区间,并提取最多前三项作为结果。

class Solution {
public:
    vector<vector<string>> suggestedProducts(vector<string>& items, string query) {
        sort(items.begin(), items.end());
        int left = 0, right = items.size() - 1;
        vector<vector<string>> result;

        for (int i = 0; i < query.length(); ++i) {
            char c = query[i];
            // 移除不匹配的左边界
            while (left <= right && (items[left].length() <= i || items[left][i] != c))
                left++;
            // 移除不匹配的右边界
            while (left <= right && (items[right].length() <= i || items[right][i] != c))
                right--;

            result.push_back({});
            // 添加至多三个建议
            for (int j = left; j <= right && j < left + 3; ++j) {
                result.back().push_back(items[j]);
            }
        }
        return result;
    }
};

限定步数下返回原点的方法数

有一个长度为 arrLen 的数组,起始位置在索引 0。每步可以选择向左、向右或不动。求在恰好执行 steps 步之后回到位置 0 的不同路径数目,结果对 \(10^9+7\) 取模。

使用动态规划,设 dp[i][j] 表示第 i 步后位于位置 j 的方案数。由于状态只依赖前一层,可用滚动数组优化空间。注意实际可达的最大位置不会超过 min(steps, arrLen),以此剪枝提升效率。

class Solution {
public:
    int numWays(int steps, int arrLen) {
        const int MOD = 1e9 + 7;
        arrLen = min(arrLen, steps);
        vector<int> prev(arrLen, 0), curr(arrLen, 0);
        prev[0] = 1;

        for (int step = 1; step <= steps; ++step) {
            for (int pos = 0; pos < arrLen; ++pos) {
                curr[pos] = prev[pos];  // 原地不动
                if (pos > 0)
                    curr[pos] = (curr[pos] + prev[pos - 1]) % MOD;
                if (pos + 1 < arrLen)
                    curr[pos] = (curr[pos] + prev[pos + 1]) % MOD;
            }
            swap(prev, curr);
        }
        return prev[0];
    }
};
返回列表

上一篇:深入解析Rich Text编辑器行内样式实现

没有最新的文章了...

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。