第 379 场 LeetCode 周赛题解

A 对角线最长的矩形的面积

在这里插入图片描述

模拟

class Solution {
public:
    int areaOfMaxDiagonal(vector<vector<int>> &dimensions) {
        int res = 0, len2 = 0;
        for (auto &x: dimensions)
            if (x[0] * x[0] + x[1] * x[1] > len2 || x[0] * x[0] + x[1] * x[1] == len2 && x[0] * x[1] > res) {
                res = x[0] * x[1];
                len2 = x[0] * x[0] + x[1] * x[1];
            }
        return res;
    }
};

B 捕获黑皇后需要的最少移动次数

在这里插入图片描述
在这里插入图片描述

枚举:只有两种情况可以1次移动就能攻击黑皇后:1)白象和黑皇后在一条对角线或斜对角线上且白车没有在中间。 2)白车和黑皇后在同一行或同一列且白象没有在中间。 其他情况都要两次移动才能攻击黑皇后

class Solution {
public:
    int minMovesToCaptureTheQueen(int a, int b, int c, int d, int e, int f) {
        if (a == e && (c != e || d < min(b, f) || d > max(b, f)))
            return 1;
        if (b == f && (d != f || c < min(a, e) || c > max(a, e)))
            return 1;
        if (c - d == e - f && (a - b != e - f || a < min(c, e) || a > max(c, e)))
            return 1;
        if (c + d == e + f && (a + b != e + f || a < min(c, e) || a > max(c, e)))
            return 1;
        return 2;
    }
};

C 移除后集合的最多元素数

在这里插入图片描述

贪心:分别统计两个数组中各数出现的频率,然后先从 n u m s 1 nums1 nums1 中删除 n / 2 n/2 n/2 个数,优先删在 n u m s 1 nums1 nums1 出现次数大于 1 的数,其次删在 n u m s 2 nums2 nums2 中有出现的数,最后删其他的数。然后再从 n u m s 2 nums2 nums2 中删除 n / 2 n/2 n/2 个数,优先删在 n u m s 2 nums2 nums2 出现次数大于 1 的数,其次删在当前 s s s 中有出现的数,最后删其他的数。

class Solution {
public:
    int maximumSetSize(vector<int> &nums1, vector<int> &nums2) {
        unordered_map<int, int> cnt1, cnt2;
        for (auto x: nums1)
            cnt1[x]++;
        for (auto x: nums2)
            cnt2[x]++;
        int n = nums1.size();
        unordered_set<int> res;
        {
            int rm = n / 2;
            for (auto &[v, f]: cnt1)
                if (f != 1) {
                    int d = min(rm, f - 1);
                    f -= d;
                    rm -= d;
                }
            if (rm != 0) {
                for (auto &[v, f]: cnt1)
                    if (f && cnt2.count(v)) {
                        f = 0;
                        if (--rm == 0)
                            break;
                    }
            }
            if (rm != 0) {
                for (auto &[v, f]: cnt1)
                    if (f) {
                        f = 0;
                        if (--rm == 0)
                            break;
                    }
            }
            for (auto &[v, f]: cnt1)
                if (f != 0)
                    res.insert(v);
        }

        int rm = n / 2;
        for (auto &[v, f]: cnt2) {
            if (f != 1) {
                int d = min(rm, f - 1);
                f -= d;
                rm -= d;
            }
        }
        if (rm != 0) {
            for (auto &[v, f]: cnt2)
                if (f && res.count(v)) {
                    f = 0;
                    if (--rm == 0)
                        break;
                }
        }
        if (rm != 0) {
            for (auto &[v, f]: cnt2)
                if (f) {
                    f = 0;
                    if (--rm == 0)
                        break;
                }
        }
        for (auto &[v, f]: cnt2)
            if (f != 0)
                res.insert(v);
        return res.size();
    }
};

D 执行操作后的最大分割数量

在这里插入图片描述
在这里插入图片描述

前缀和 + 二分 + 动态规划 + 枚举:设 p s [ i ] [ j ] ps[i][j] ps[i][j] s [ 0 , i − 1 ] s[0,i-1] s[0,i1] ( ′ a ′ + j ) ('a'+j) (a+j) 字符出现的个数,设 p [ i ] p[i] p[i] 为字符串 s [ i , s . s i z e ( ) − 1 ] s[i,s.size()-1] s[i,s.size()1] 不执行替换操作按题目要求的最大分割数量。可以逆序求 p [ i ] p[i] p[i] :通过二分求包含 k k k 个不同字符的最长前缀 s [ i , l ] s[i,l] s[i,l] ,则有 p [ i ] = p [ l + 1 ] + 1 p[i]=p[l+1]+1 p[i]=p[l+1]+1 。然后正序枚举各位替换成各字符的情况,枚举过程中记录已遍历过的字符串前缀的分割数量,以及当前分割中出现过哪些字符。

class Solution {
public:
    int maxPartitionsAfterOperations(string s, int k) {
        int n = s.size();
        int ps[n + 1][26];
        for (int j = 0; j < 26; j++)
            ps[0][j] = 0;
        for (int i = 0; i < n; i++)
            for (int j = 0; j < 26; j++)//计算前缀和
                ps[i + 1][j] = s[i] - 'a' == j ? ps[i][j] + 1 : ps[i][j];
        int p[n + 1];
        p[n] = 0;
        for (int i = n - 1; i >= 0; i--) {//求p数组
            vector<int> vis(26, -1);
            int l = i, r = n - 1;
            while (l < r) {
                int mid = (l + r + 1) / 2;
                int cnt = 0;
                for (int j = 0; j < 26; j++)
                    if (ps[mid + 1][j] - ps[i][j] != 0)
                        cnt++;

                if (cnt <= k)
                    l = mid;
                else
                    r = mid - 1;
            }
            p[i] = p[l + 1] + 1;
        }

        int res = p[0];//不替换的情况
        int vis = 0;//当前分割中出现过的字符的 mask
        int cnt_pre = 0;//已遍历过的字符串前缀的分割数量
        for (int i = 0; i < n; i++) {//枚举各位
            for (int j = 0; j < 26; j++) {//枚举s[i]替换成 'a'+j 的情况
                int tmp = vis | (1 << j);// 将'a'+j 加入 mask
                if (pop_cnt(tmp) > k) {// 'a'+j 与当前分割不在同一分割
                    tmp = 1 << j;//'a'+j 所在新的分割的 mask
                    int l = i, r = n - 1;
                    while (l < r) {//二分求 'a'+j 所在分割的右边界 
                        int mid = (l + r + 1) / 2;
                        int cnt = 0;
                        for (int j = 0; j < 26; j++)
                            if (tmp >> j & 1 || ps[mid + 1][j] - ps[i + 1][j] != 0)
                                cnt++;
                        if (cnt <= k)
                            l = mid;
                        else
                            r = mid - 1;
                    }
                    res = max(res, cnt_pre + 1 + 1 + p[l + 1]);
                } else {// 'a'+j 与当前分割在同一分割
                    int l = i, r = n - 1;
                    while (l < r) {//二分求当前分割的右边界 
                        int mid = (l + r + 1) / 2;
                        int cnt = 0;
                        for (int j = 0; j < 26; j++)
                            if (tmp >> j & 1 || ps[mid + 1][j] - ps[i + 1][j] != 0)
                                cnt++;
                        if (cnt <= k)
                            l = mid;
                        else
                            r = mid - 1;
                    }
                    res = max(res, cnt_pre + 1 + p[l + 1]);
                }
            }
            //更新当前分割的 mask
            vis |= 1 << (s[i] - 'a');
            if (pop_cnt(vis) > k) {
                cnt_pre++;//更新已遍历过的字符串前缀的分割数量
                vis = 1 << (s[i] - 'a');
            }
        }
        return res;
    }

    int pop_cnt(int x) {//返回二进制表示中1的位数
        int res = 0;
        for (int i = 0; i < 32; i++)
            if (x >> i & 1)
                res++;
        return res;
    }
};

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

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

相关文章

安全强化学习笔记

这里写自定义目录标题 参考资料 Safe Reinforcement Learning环境算法CPO 2017 ICMLPCPO 2019 ICLRFOCOPS 2020 NIPSCRPO 2021 ICMLCUP 2022 NIPS TRPO 如何看懂TRPO里所有的数学推导细节? - 小小何先生的回答 - 知乎 参考资料 Safe Reinforcement Learning 安全/约束强化学…

排序算法之七:归并排序(非递归)

1.非递归实现思路 我们之前学习了递归实现的归并排序&#xff0c;是分治的思想&#xff0c;即先分解&#xff0c;再归并 这篇文章我们讲一下非递归的实现 非递归实现的思路是模拟递归的过程&#xff0c;在递归过程中&#xff0c;我们找key将数组分成左右数组&#xff0c;然后…

uni-table改表头的样式,uniapp项目,颜色,字体颜色

:first-child,:nth-child选择器的使用和隔行变色_firstchild怎么用-CSDN博客

Rocketmq rust版本-开篇

我是蚂蚁背大象(Apache EventMesh PMC&Committer)&#xff0c;文章对你有帮助给Rocketmq-rust star,关注我GitHub:mxsm&#xff0c;文章有不正确的地方请您斧正,创建ISSUE提交PR~谢谢! Emal:mxsmapache.com Rust重构Rocketmq,大家好我是mxsm(Apache EventMesh PMC&Comm…

高级分布式系统目录汇总

临近《高级分布式系统》考试&#xff0c;所以一边复习((⊙o⊙)…&#xff0c;其实是预习&#xff0c;哈哈^_^)&#xff0c;一边写高级分布式博客。先将高级分布式章节以及相关博客罗列如下&#xff0c;欢迎和大家一起学习。资料部分参考上了以下教材&#xff1a; 分布式实时系统…

css 前端实现通过css动画实现进度条动态加载效果

效果图 代码 CommonProcess.vue 进度条动态加载组件代码 <!-- 进度条组件 --> <template><div class"common_process"><div v-for"(item, index) in dataList" :key"processType index" class"common_process_item…

Qt6入门教程 6:Qt元对象系统

目录 一.什么是Qt元对象系统&#xff1f; 二.编译时Qt Creator偷摸做了哪些事情&#xff1f; 1.uic 2.rcc 3.moc 一.什么是Qt元对象系统&#xff1f; Qt中的元对象系统&#xff08;Meta-Object System&#xff09;提供了对象间通信的信号和槽机制、运行时类型信息和动态属…

算法复习——01背包

01背包 DP分析法要素有&#xff1a;集合&#xff0c;属性&#xff0c;状态计算 &#xff08;集合是指只考虑前i个&#xff0c;总体积小于等于j的所有选法&#xff0c;存取的属性是所有选法的最大值&#xff09; 状态方程计算&#xff08;所有选法可以分为2种不同的子集&#x…

快速高效处理长图:按指定高度切长图的方法,提升设计品质

在现代视觉传达设计中&#xff0c;长图作为一种常见的表现形式&#xff0c;被广泛应用于各种场景。如何快速高效地处理长图&#xff0c;使其符合设计要求和用户体验&#xff0c;成为设计师们面临的一大挑战。现在来看“办公提效工具”如何按指定高度切长图&#xff0c;提升设计…

华清远见作业第二十七天——网络编程(第二天)

思维导图&#xff1a; 在虚拟机实现客户端控制机械臂 代码&#xff1a; #include<stdio.h> #include<string.h> #include<stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <a.h> #define SER_PORT 8888 //服务端口 #d…

基于信号完整性的PCB设计原则

最小化单根信号线质量的一些PCB设计建议 1. 使用受控阻抗线&#xff1b; 2. 理想情况下&#xff0c;所有信号都应该使用完整的电源或地平面作为其返回路径&#xff0c;关键信号则使用地平面作为返回路径&#xff1b; 3. 信号的返回参考面发生变化时&#xff0c;在尽可能接近…

Seaborn——可视化的具体API应用

一、Seaborn概述 Seaborn 是基于 matplotlib的图形可视化 python包。提供了一种高度交互式界面&#xff0c;便于用户能够做出各种有吸引力的统计图表。 Seaborn在 matplotlib的基础上进行了更高级的API封装&#xff0c;从而使得作图更加容易&#xff0c;在大多数情况下使用seab…

WEB 3D技术 three.js 阴影属性

上文 WEB 3D技术 three.js 光照与阴影 我们说了阴影 那么 我们继续将阴影的属性 目前 我们的代码 import ./style.css import * as THREE from "three"; import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.js";//创建相机 cons…

集成xxljob项目如何迁移到K8S

前言 大家好&#xff0c;今天我们将基于XXL-Job&#xff0c;探讨任务调度迁移到云端的相关话题。 XXL-Job是一款功能强大、易用可靠的国产分布式任务调度平台&#xff0c;是目前国内使用比较广泛的分布式任务调度平台之一。它的主要特点包括&#xff1a; 支持分布式、多线程…

Java中的异常处理

目录 前言&#xff1a; 异常简介&#xff1a; Error类&#xff1a; Exception类&#xff1a; Exception异常&#xff1a; 运行异常&#xff1a; 编译异常&#xff1a; throw和throws关键字&#xff1a; throw: throws: try-catch关键字&#xff1a; finally: 为…

nvcc -V显示command not found

出现这个问题&#xff0c;不仅是 nvcc -V会显示command not found,nvidia-smi同样也会显示 解决方法如下&#xff1a; 1&#xff09;这里首先转换到CUDA所在位置&#xff0c;一般是在这个位置 cd /usr/local 2&#xff09;打开、编辑环境变量的配置文件 vim ~/.bashrc …

NLP论文阅读记录 - 2021 | WOS 利用 ParsBERT 和预训练 mT5 进行波斯语抽象文本摘要

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.前提三.本文方法A. 序列到序列 ParsBERTB、mT5 四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4.6 细粒度分析 五 总结思考 前言 Leveraging ParsBERT and Pretrained …

【JupyterLab】在 conda 虚拟环境中 JupyterLab 的安装与使用

【JupyterLab】在 conda 虚拟环境中 JupyterLab 的安装与使用 1 JupyterLab 介绍2 安装2.1 Jupyter Kernel 与 conda 虚拟环境 3 使用3.1 安装中文语言包(Optional)3.2 启动3.3 常用快捷键3.3.1 命令模式下 3.4 远程访问个人计算机3.4.1 局域网下 1 JupyterLab 介绍 官方文档: …

分布式搜索——Elasticsearch

Elasticsearch 文章目录 Elasticsearch简介ELK技术栈Elasticsearch和Lucene 倒排索引正向索引倒排索引正向和倒排 ES概念文档和字段索引和映射Mysql与Elasticsearch 安装ES、Kibana安装单点ES创建网络拉取镜像运行 部署kibana拉取镜像部署 安装Ik插件扩展词词典停用词词典 索引…

政采网调试要求及常见问题解决方法

登录平台软件环境要求&#xff1a; 操作系统&#xff1a;建议Win10及以上&#xff08;Win10-64位专业版 版本号17134纯净安装版本&#xff09; 浏 览 器&#xff1a;IE11浏览器、谷歌120.0.6099.217&#xff08;64位正式版&#xff09;浏览器 必要软件&#xff1a;CA互联互通…