LeetCode 第 244 场周赛题解

news2024/11/17 2:36:30

前言

这是 2021-06-06 的一场 LeetCode 周赛,本场周赛的题目相较而以往而言比较简单,基本上想到点上就可以做出来,主要涉及到矩阵的旋转、贪心、滑动窗口、前缀和、二分查找等知识点。

第 244 场周赛链接:https://leetcode-cn.com/contest/weekly-contest-244/

1. 判断矩阵经轮转后是否一致

题目链接:https://leetcode.cn/problems/determine-whether-matrix-can-be-obtained-by-rotation/

题意

给你两个大小为 n n n x n n n 的二进制矩阵 m a t mat mat t a r g e t target target,判断能否通过对 m a t mat mat 进行若干次 90 度顺时针轮转操作,使得它与 t a r g e t target target 内容一致。

数据保证:

1 ≤ n ≤ 10 1 \leq n \leq 10 1n10

题解

模拟题,我们可以将实现两个函数,一个用于判断两个矩阵是否相等,另一个用于将矩阵进行 90 度顺时针轮转操作( 即令 r e t j , n − i − 1 = m a t i , j ret_{j,n - i - 1} = mat_{i, j} retj,ni1=mati,j )。

如果我们能过通过四次以内的轮转操作,将 m a t mat mat 的内容变得与 t a r g e t target target 一致,就返回 true,否则返回 false

class Solution {
private:
    bool isEqual(vector<vector<int>>& mat, vector<vector<int>>& target) {
        int n = mat.size();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (mat[i][j] != target[i][j]) {
                    return false;
                }
            }
        }
        return true;
    }
    vector<vector<int>> rotate(vector<vector<int>>& mat) {
        int n = mat.size();
        vector<vector<int>> ret(n, vector<int>(n, 0));
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                ret[j][n - i - 1] = mat[i][j];
            }
        }
        return ret;
    }
public:
    bool findRotation(vector<vector<int>>& mat, vector<vector<int>>& target) {
        for (int i = 0; i < 3; i++) {
            if (isEqual(mat, target)) {
                return true;
            }
            mat = rotate(mat);
        }
        return isEqual(mat, target);
    }
};

时间复杂度: O ( n 2 ) O(n^2) O(n2)
空间复杂度: O ( n 2 ) O(n^2) O(n2)

2. 使数组元素相等的减少操作次数

题目链接:https://leetcode.cn/problems/reduction-operations-to-make-the-array-elements-equal/

题意

给你一个有 n n n 个元素的整数数组 A A A ,你的目标是令 A A A 中的所有元素相等,完成一次减少操作需要遵照下面的几个步骤:

  • 找出 A A A 中的最大值,记录其下标 i i i。如果有多个元素都是最大值,则取下标最小的 。
  • 找出 A A A 中的次大值,将其记为 v a l u e value value ,要求其严格小于 A i A_i Ai
  • A i = v a l u e A_i =value Ai=value

返回使 A A A 中的所有元素相等的最少操作次数。

数据保证:

1 ≤ n ≤ 5 ⋅ 1 0 4 1 \leq n \leq 5 \cdot 10^4 1n5104
1 ≤ A i ≤ 5 ⋅ 1 0 4 1 \leq A_i \leq 5 \cdot 10^4 1Ai5104

题解

经过对样例的模拟可以发现,数组中的元素都是逐渐减少的,要想令 A A A 中的所有元素相等,则 A A A 中的最大元素开始操作,让所有的元素最终都变为 m i n ( A ) min(A) min(A)

对于一个元素 A i → m i n ( A ) A_i \rightarrow min(A) Aimin(A), 它需要不断变为次大值,最终才会变为 m i n ( A ) min(A) min(A),所需要的操作次数等于 A A A 中比 A i A_i Ai 小的数字个数(即重复不计)。

这里先对 A A A 排序,然后通过维护一个自底向上单调递增且不包含相同元素的栈来计算操作个数。

class Solution {
public:
    int reductionOperations(vector<int>& nums) {
        stack<int> s;
        sort(nums.begin(), nums.end());
        for (auto num : nums) {
            if (s.empty() || s.top() != num) {
                s.push(num);
            }   
        }
        int ans = 0, n = nums.size();
        for (int i = n - 1; i >= 0; i--) {
            if (nums[i] != s.top()) {
                s.pop();
            }
            ans += s.size() - 1;
        }
        return ans;
    }
};

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

3. 使二进制字符串字符交替的最少反转次数

题目链接:https://leetcode.cn/problems/minimum-number-of-flips-to-make-the-binary-string-alternating/

题意

给你一个 二进制 字符串 s s s 。你可以按任意顺序执行以下两种操作任意次:

  • 类型 1 :删除 s s s 的第一个字符并将它 添加 s s s 结尾。
  • 类型 2 :选择 s s s 中任意一个字符并将该字符 反转 ,即 0 ⇒ 1 ,   1 ⇒ 0 0 \Rightarrow 1, \ 1 \Rightarrow 0 01, 10

请你返回使 s s s 变成 交替 字符串的前提下,类型 2最少 操作次数 。

数据保证:

1 ≤ s . l e n g t h ≤ 1 0 5 1 \leq s.length \leq 10^5 1s.length105

题解

字符串 s s s 最终会变为 1010... 1010... 1010... 或者 0101... 0101... 0101...,这两种形式中的一种。

假设没有操作 1 的话,我们只需要利用操作 2 将 s s s 变成这两种最终形式,然后计算所需的操作 2 的次数 c n t 1 cnt_1 cnt1 c n t 2 cnt_2 cnt2,最终取 m i n ( c n t 1 , c n t 2 ) min(cnt_1, cnt_2) min(cnt1,cnt2)

由于这两种最终形式对应位置都是互不相同的,所以 c n t 2 = s . l e n g t h − c n t 1 cnt_2 = s.length - cnt_1 cnt2=s.lengthcnt1,因此我们只需要计算 c n t 1 cnt_1 cnt1,最终取 m i n ( c n t 1 , s . l e n g t h − c n t 1 ) min(cnt_1, s.length - cnt_1) min(cnt1,s.lengthcnt1)

为了处理操作 1 对结果的影响,我们使用滑动窗口算法。令 T = s + s T = s+s T=s+s,然后用大小为 s . l e n g t h s.length s.length 的窗口进行扫描,如下图所示:

在这里插入图片描述
(上图取自 LeetCode @Ikaruga 题解的图片)

在扫描的过程中,不断更新 c n t 1 cnt_1 cnt1 的值,同时通过一个结果变量 a n s ans ans 维护 m i n ( c n t 1 , s . l e n g t h − c n t 1 ) min(cnt_1, s.length - cnt_1) min(cnt1,s.lengthcnt1) 的值。

class Solution {
public:
    int minFlips(string s) {
        int n = s.length();
        int cnt = 0;
        string t = "01";
        for (int i = 0; i < n; i++) {
            if (s[i] != t[i % 2]) {
                cnt++;
            }
        }
        // 滑动窗口扫描的过程
        int ans = min(cnt, n - cnt);
        for (int i = 0; i < n; i++) {
            cnt += s[i] != t[(n + i) % 2];
            cnt -= s[i] != t[i % 2];
            ans = min(ans, min(cnt, n - cnt));
        }
        return ans;
    }
};

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( 1 ) O(1) O(1)

4. 装包裹的最小浪费空间

题目链接:https://leetcode.cn/problems/minimum-space-wasted-from-packaging/

题意

给你 n n n 个包裹,它们的尺寸分别为 P i P_i Pi

有 m 个供应商,每个供销商提供 B i B_i Bi 种箱子,箱子的尺寸为 B i j B_{ij} Bij,每种尺寸的箱子都有无数个。

设包裹的大小为 p p p,箱子的大小为 b b b。当 p ≤ b p \leq b pb 时,包裹就可以被放进这个箱子中;这时,浪费的空间就表示为 b − p b - p bp。你需要把包裹都装在箱子里,每个箱子装一个包裹。

你需要选择一个使得 总浪费空间最小 供应商,返回最小总浪费空间。如果没有供应商可以满足,则返回 -1 。答案需要对 1 0 9 + 7 10^9 + 7 109+7 取余。

数据保证:

1 ≤ n , m , P i , B i j ≤ 1 0 5 1 \leq n, m,P_i, B_{ij} \leq 10^5 1n,m,Pi,Bij105
∑ i = 0 m B i ≤ 1 0 5 \displaystyle \sum^{m}_{i = 0}{B_i} \leq 10^5 i=0mBi105

题解

我们可以计算出各个供应商提供箱子的总浪费空间,然后取最小值。

详细思路是,我们先按供应商从 0 → m 0 \rightarrow m 0m 进行枚举。根据数据范围 ∑ i = 0 m B i ≤ 1 0 5 \displaystyle \sum^{m}_{i = 0}{B_i} \leq 10^5 i=0mBi105,之后枚举的就只能是相应供应商的提供的箱子尺寸,然后再到 P P P 中寻找所有能放进该箱子中的包裹,于是就可以求出使用该箱子所浪费的空间为 :
( R − L ) ⋅ B i j − ∑ k = L R P k (R-L) \cdot B_{ij} - \displaystyle \sum^{R}_{k=L}{P_k} (RL)Bijk=LRPk

注意到,我们要尽可能使得浪费的空间小,所以我们要尽可能用较小的箱子,我们需要对所有的 B i B_{i} Bi 进行排序。

为了提高 寻找能放进箱子的包裹 的效率,我们先对 P P P 进行排序,然后利用二分查找确定右边界 R R R,以上次的右边界结果作为左边界 L L L

因为 ∑ j = 0 B i ∑ k = L j R j P k = ∑ j = 0 n P i \displaystyle \sum^{B_i}_{j=0} \sum^{R_j}_{k=L_j}{P_k} = \sum^{n}_{j=0}{P_i} j=0Bik=LjRjPk=j=0nPi,所以我们只要先计算出最小的所用箱子尺寸总和 S u m Sum Sum最后再减去所有包裹的尺寸总和,就可以得到最后的结果。

const int MOD = 1e9 + 7;
using ll = long long;

class Solution {
public:
    int minWastedSpace(vector<int>& packages, vector<vector<int>>& boxes) {
        ll ans = LONG_MAX;
        int m = boxes.size();
        sort(packages.begin(), packages.end());
        for (int i = 0; i < m; i++) {
            sort(boxes[i].begin(), boxes[i].end());
            if (boxes[i].back() < packages.back()) {
                continue;
            }
            int last = 0;
            ll sum = 0;
            for (auto box : boxes[i]) {
                int pos = upper_bound(packages.begin(), packages.end(), box) - packages.begin();
                sum += static_cast<ll>(pos - last) * box;
                last = pos;
            }
            
            ans = min(ans, sum);
        }
        if (ans == LONG_MAX) {
            return -1;
        }
        for (auto package : packages) {
            ans -= package;
        }
        return ans % MOD;
    }
};

这是很久之前写的一篇题解了,当时考虑到没有时效性了,就一直没有发。今年偶然翻到,发现 3、4 题还是有点意思的,决定分享一下,建议看到的同学可以去写一下后面两题。

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

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

相关文章

SpringBoot+Vue实现前后端分离的学校快递站点管理系统

文末获取源码 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a;JavaScript、Vue.js 、css3 开发工具&#xff1a;IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库&#xff1a;MySQL 5.7/8.0 数据库管理工具&#xff1a;phpstudy/Navicat JD…

机器人开发--雷达lidar

机器人开发--雷达lidar1 介绍2 分类2.1 整体分类2.2 机械式&#xff08;三角&ToF&#xff09;三角测距激光雷达ToF测距激光雷达3 机械式单线ToF激光雷达3.1 扫描原理3.2 不同材料反射率3.3 核心参数参考1 介绍 激光雷达&#xff08;英文&#xff1a;Laser Radar &#xff…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java制造类企业erp23725

面对老师五花八门的设计要求&#xff0c;首先自己要明确好自己的题目方向&#xff0c;并且与老师多多沟通&#xff0c;用什么编程语言&#xff0c;使用到什么数据库&#xff0c;确定好了&#xff0c;在开始着手毕业设计。 1&#xff1a;选择课题的第一选择就是尽量选择指导老师…

第十四周周报

学习目标&#xff1a; 一、论文“Vector Quantized Diffusion Model for Text-to-Image Synthesis”的Code 二、猫狗识别、人脸识别模型 学习内容&#xff1a; Code 学习时间&#xff1a; 12.4-12.9 学习产出&#xff1a; 一、论文Code 正向过程&#xff1a; 先通过Tam…

Python——学生管理系统

实现学生系统的增&#xff0c;删&#xff0c;查&#xff0c;打印所有学生功能&#xff0c;分别介绍使用列表存储和使用文件存储的代码 使用列表存储 import sys students []def menu():print("1. 新增学生")print("2. 显示学生")print("3. 查找学生…

【OpenCV学习】第10课:形态学操作的应用-图像去掉干扰线丶干扰点

仅自学做笔记用,后续有错误会更改 理论 去干扰线干扰点的操作方法&#xff0c; 大体上与第9课所说的提取水平/垂直线一致&#xff0c; 只是把核改为矩形&#xff0c; 不要线型就行&#xff0c;反正都是通过开操作来实行的。 操作流程&#xff1a; 输入图像&#xff08;一般是…

python数据分析:湖南省第七次人口普查可视化

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~ 今天案例难度指数: ☆☆☆ 准备 环境使用&#xff1a; Anaconda (python3.9) –> 识别我们写的代码 开发工具&#xff1a; jupyter notebook –> 代码编辑功能敲代码的工具 相关模块&#xff1a; pandas pyechart…

[附源码]计算机毕业设计基于Web的绿色环保网站Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

c# .net iot树莓派/香橙派用到物联网包Iot.Device.bindings 支持设备说明文档

c# .net iot树莓派&#xff08;进口&#xff0c;贵&#xff09;/香橙派&#xff08;国产&#xff0c;功能相同&#xff0c;性价比高&#xff09;用到物联网包Iot.Device.bindings 支持设备说明文档 我们c# .net iot开发树莓派/香橙派都需要用到Iot.Device.bindings、System.De…

RNA-seq 详细教程:假设检验和多重检验(8)

学习目标 了解模型拟合的过程比较两种假设检验方法&#xff08;Wald test vs. LRT&#xff09;了解多重测试校正的重要性了解用于多重测试校正的不同方法1. 模型拟合和假设检验 DESeq2 工作流程的最后一步是对每个基因进行计数并将其拟合到模型中并测试差异表达。 Hypothesis t…

osgEarth各个示例分析目录

概述 由于数字地球项目需要osgEarth的代码知识&#xff0c;故决定学习osgEarth的示例&#xff0c;示例中有很多可以借鉴的内容。以下是分析目录&#xff0c;完全是随机进行的&#xff0c;并没有什么上下文逻辑。 每一篇代码边学习边分析&#xff0c;如果有错误&#xff0c;请…

【Java面试】说说JVM的内存结构以及他们那些会产生内存溢出?

文章目录内存结构内存溢出的产生内存结构 对于JVM的内存结构&#xff0c;我将按照上面两张图配合来讲。 Java Source就是我们的Java源代码&#xff0c;经过JVM编译器编译之后变为Java Class也称Java字节码文件。当我们运行java命令对字节码文件进行运行的时候&#xff0c;将会…

深度学习-三维卷积神经网络(3DCNN)

1. 3DCNN理解 2D卷积仅仅考虑2D图片的空间信息&#xff0c;所以只适用于单张2D图片的视觉理解任务。在处理3D图像或视频时&#xff0c;网络的输入多了一个维度&#xff0c;输入由(c,height,width)(c,height,width)(c,height,width)变为了(c,depth,height,width)(c,depth,height…

计算机毕业设计django基于python学生考试成绩数据分析与可视化系统

项目介绍 随着社会的逐步发展,计算机网络技术对人们工作、生活影响是全面且深入的。基于计算机网络的管理系统越来越受到人们的欢迎,人们可以通过基于网络的管理系统进行实时数据信息查询、管理数据信息等,给人们的生活、工作带来便利。 在学校的日常管理工作中,学生成绩的统计…

【Python计算机视觉】项目实战之图像增强imguag对关键点变换、标注框变化(附源码 超详细必看)

需要源码或运行有问题请点赞关注收藏后评论区留言私信~~~ 一、imgaug简介 imguag使一个用于机器学习实验中图像增强的Python依赖库&#xff0c;支持Python2.7和Python3.4以上的版本&#xff0c;它支持多种图像增强技术&#xff0c;并允许轻松地组合这些技术&#xff0c;具有简…

uniapp中如何使用vuex进行状态管理(登录小案例讲解)

前言 本篇文章来讲解uniapp中如何使用vuex来实现状态管理&#xff0c;后面会讲实现登录状态管理的案例。如果之前学过vuex全家桶的同学那应该没啥问题&#xff0c;在uniapp中使用vuex和vue中基本是一样的。 什么是vuex 简单来说就是vue中的状态管理仓库&#xff0c;对于vuex…

从文件包含到RCE方法

前言 大家在参加众测的行动时&#xff0c;若是发现了以下基础危害不大的漏洞&#xff0c;不建议直接提交的&#xff0c;而是应该想办法看&#xff0c;能不能对该漏洞进行升级&#xff0c;扩大其危害&#xff0c;多拿点奖励。当然&#xff0c;文件包含不算常见&#xff0c;经常…

车床零件加工调度问题

目录 题目 思路 代码 运行结果 题目 某车间需要用一台车床和一台加工A&#xff0c;B&#xff0c;C&#xff0c;D4个零件。每个零件都需要先用车床加工&#xff0c;再用加工。车床和加工每个零件所需的工时&#xff08;包括加工前的准备时间以及加工后的处理时间)如下表所示。…

移动端APP测试常见面试题精析

现在面试测试职位&#xff0c;要求非常全面&#xff0c;那么APP测试一般需要哪些技术呢&#xff1f;下面总结了APP测试常见面试题&#xff1a; 1.Android四大组件? Activity:描述UI&#xff0c;并且处理用户与机器屏幕的交互。应用程序中&#xff0c;一个Activity就相当于手…

c++ 基础(新手入门必看)

C基础讲解&#xff0c;用于C语言向C的衔接 文章目录命名空间C输入输出缺省参数函数重载引用内联函数auto关键字基于范围for循环指针空值 -- nullptr命名空间 如果你以前看到过C的程序&#xff0c;那么你大概率会看到这样一行代码 这行代码就用到了命名空间的知识&#xff0c;…