Leetcode 387周赛:3069, 3070, 3071

文章目录

  • Leetcode3069 将元素分配到两个数组中 I
  • Leetcode3070 元素和小于等于k的子矩阵数目
  • Leetcode3071 在矩阵上写出字母Y所需的最小操作次数

Leetcode3069 将元素分配到两个数组中 I

题目:给你一个下标从 1 开始、包含 不同 整数的数组 nums ,数组长度为 n
你需要通过 n 次操作,将 nums 中的所有元素分配到两个数组 arr1arr2 中。在第一次操作中,将 nums[1] 追加到 arr1 。在第二次操作中,将 nums[2] 追加到 arr2 。之后,在第 i 次操作中:

如果 arr1 的最后一个元素 大于 arr2 的最后一个元素,就将 nums[i] 追加到 arr1 。否则,将 nums[i] 追加到 arr2
通过连接数组 arr1 和 arr2 形成数组 result 。例如,如果 arr1 == [1,2,3]arr2 == [4,5,6] ,那么 result = [1,2,3,4,5,6]

返回数组 result
link

题解

  • 很简单,直接按照题目意思,定义一个final result[]数组和一个auxiliary array temp[]
  • 遍历数组,按题意 push_back到不同数组
  • 最后在遍历数组temp,把所有元素加到result[]后面

时间复杂度: O ( n ) O(n) O(n) ——只用遍历数组即可
空间复杂度: O ( n ) O(n) O(n) ——虽然一开始开了2个vector,但两个vector的总元素数量是num.size()

代码

class Solution {
public:vector<int> resultArray(vector<int>& nums) {if (nums.size() <= 2) {return nums;}vector<int> result;vector<int> temp;result.push_back(nums[0]);temp.push_back(nums[1]);int x = nums[0], y = nums[1];for (int i = 2; i < nums.size(); ++i) {if (x > y) {result.push_back(nums[i]);x = nums[i];}else {temp.push_back(nums[i]);y = nums[i];}}for (int i = 0; i < temp.size(); ++i) {result.push_back(temp[i]);}return result;}
};

Leetcode3070 元素和小于等于k的子矩阵数目

题目:给你一个下标从 0 开始的整数矩阵 grid 和一个整数 k
返回包含 grid 左上角元素、元素和小于或等于 k子矩阵 的 数目。
link

题解

当时思路:

  • 开一个和 grid 一样大的数组
  • 遍历一遍grid,同时初始化temp
    t e m p [ i ] [ j ] = ∑ k = 0 j n u m s [ i ] [ k ] temp[i][j] = \sum_{k=0}^{j}nums[i][k] temp[i][j]=k=0jnums[i][k],也就是说temp[i][j]存放该行第一个元素开始到当前元素的sum
  • 遍历一遍temp,更新temp[i][j]值并计算符合条件的 submatrices 个数
    • 显然,如果是第一行的元素的话,第一遍初始化的temp[i][j]值就是对应 submatrice 的sum
    • 如果非1st row 元素的话,temp[i][j]等于比他少一行的子矩阵值+自己的初始值

时间复杂度: O ( m ⋅ n ) O(m\cdot n) O(mn) ——只用遍历两遍数组
空间复杂度: O ( m ⋅ n ) O(m\cdot n) O(mn) ——建了一个辅助数组

优化:

  1. 不用遍历2遍,只需一遍每次temp[i][j] = temp[i - 1][j] + temp[i][j - 1] + grid[i][j] - temp[i - 1][j - 1],很容易理解
  2. 直接在原始数组上更新,不用创建辅助数组
    优化后时间复杂度不变,空间复杂度降为 O ( 1 ) O(1) O(1).

看别人的题解说是典型的二位前缀和问题
跟 algorithm final 有一题很像 link

代码
(未优化前代码,优化的也很容易修正)

class Solution {
public:int countSubmatrices(vector<vector<int>>& grid, int k) {int m = grid.size();int n = grid[0].size();vector<vector<int>> temp(m, vector<int>(n, 1));for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {if (j == 0)temp[i][j] = grid[i][j];elsetemp[i][j] = temp[i][j - 1] + grid[i][j];}}int count = 0;int sum = 0;for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {if (i != 0) {temp[i][j] += temp[i - 1][j];}if (temp[i][j] <= k)++count;}}return count;}
};

Leetcode3071 在矩阵上写出字母Y所需的最小操作次数

题目:给你一个下标从 0 开始、大小为 n x n 的矩阵 grid ,其中 n 为奇数,且 grid[r][c] 的值为 012
如果一个单元格属于以下三条线中的任一一条,我们就认为它是字母 Y 的一部分:
从左上角单元格开始到矩阵中心单元格结束的对角线。
从右上角单元格开始到矩阵中心单元格结束的对角线。
从中心单元格开始到矩阵底部边界结束的垂直线。
当且仅当满足以下全部条件时,可以判定矩阵上写有字母 Y

属于 Y 的所有单元格的值相等。
不属于 Y 的所有单元格的值相等。
属于 Y 的单元格的值与不属于Y的单元格的值不同。
每次操作你可以将任意单元格的值改变为 012 。返回在矩阵上写出字母 Y 所需的 最少 操作次数。
link

题解

  • 思路:hash table,因为单元格值固定,只需要开2个int[3]数组即可,分别统计Y中、其他区域每个数字出现次数
  • 遍历一遍grid[][],统计次数.
  • Y坐标特点:
    • 正对角线(i == j)上半部分
    • 反对角线(i + j == n)上半部分
    • center 列下半部分
  • 找到Y[]E[]数组中最大值,即出现频率最大的数.
    • 如果这两个数不等,则可以计算要改变的次数了,直接返回
    • 如果不等,找到两个数组中次大的数,然后分别计算修改次数,选小的返回

时间复杂度: O ( n 2 ) O(n^2) O(n2) ——因为hash table固定,所以复杂度是constant
空间复杂度: O ( k ) O(k) O(k) k is constant

代码

class Solution {
public:int minimumOperationsToWriteY(vector<vector<int>>& grid) {int n = grid.size();int center = n >> 1;int Y[3] = {};int E[3] = {};int sum1 = 0, sum2 = 0;for (int i = 0; i < n; ++i) {for (int j = 0; j < n; ++j) {if (i == j && i <= center) {++Y[grid[i][j]];++sum1;}else if (i + j == n - 1 && i < center) {++Y[grid[i][j]];++sum1;}else if (j == center && i > center) {++Y[grid[i][j]];++sum1;}else {++E[grid[i][j]];++sum2;}}}int maxY = 0, maxE = 0;int sY = -1, sE = -1;for (int i = 1; i < 3; ++i) {if (Y[i] > Y[maxY])maxY = i;if (E[i] > E[maxE])maxE = i;}if (maxY != maxE)return sum1 - Y[maxY] + sum2 - E[maxE];else {for (int i = 0; i < 3; ++i) {if (i != maxY) {if (sY == -1 || Y[i] > Y[sY])sY = i;}if (i != maxE) {if (sE == -1 || E[i] > E[sE]) sE = i;}}int costY = sum1 - Y[maxY] + sum2 - E[sE];int costE = sum2 - E[maxE] + sum1 - Y[sY];return min(costY, costE);}}
};

最后一题待补,当场没做出来

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

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

相关文章

十秒学会Ubuntu命令行:从入门到进阶

一、引言 在使用Ubuntu操作系统时&#xff0c;命令行界面&#xff08;CLI&#xff09;是不可或缺的一部分。对于初学者来说&#xff0c;掌握基本的命令行操作可以帮助他们更高效地管理系统和软件。 本文将介绍一些常见的Ubuntu命令以及如何解决与命令行相关的问题。 目录 一、…

Java-类和对象

Scanner input new Scanner(System.in);类: 把 具有相同属性的对象 放在一起,组成一个集合public class 类名{// 定义属性: 名词数据类型 属性名; // 属性名 首字母小写,如果有多个单词,则其余首字母大写//定义方法: 动词,访问修饰符 返回值类型 方法名(){// 方法的执行内容…

基于umdf2的驱动程序

源码下载&#xff1a;https://download.csdn.net/download/mao0514/88915667 win10 64位系统vs2019wdk inf安装&#xff1a; VOID UMDF2Driver1EvtIoDeviceControl(_In_ WDFQUEUE Queue,_In_ WDFREQUEST Request,_In_ size_t OutputBufferLength,_In_ size_t InputBufferLen…

BUUCTF-Misc-百里挑一

题目链接&#xff1a;BUUCTF在线评测 (buuoj.cn) 下载附件打开是一个流量包文件&#xff1a; 全是在传图片时候的流量&#xff0c;先把图片保存出来文件–>导出对象–>HTTP–>保存到一个文件夹 然后使用kali下的exiftool找到了一半flag exiftool *|grep flag 另外一半…

test-mapper/service

1 package com.xxx.common.mapper;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.xxx.common.entity.Collect; import com.baomidou.mybatisplus.core.mapper.BaseMapper;import java.util.List;/*** <p>* Mapper 接口* </p>…

工业网关、物联网网关与PLC网关是什么?

网关是什么&#xff1f; 网关是一种用于连接不同网络的网络设备&#xff0c;其作用是实现网络之间的通信和数据交换。它负责将一个网络的数据转发到另一个网络&#xff0c;并且可以进行路由、转换和过滤等处理。通常用于连接局域网和广域网之间&#xff0c;可以是硬件设备或者软…

7、Linux-防火墙和配置静态ip

一、防火墙&#xff08;防火墙服务名firewalld&#xff09; 防火墙配置命令&#xff1a;firewall-cmd firewall-cmd --help&#xff1a;防火墙帮助firewall-cmd --state&#xff1a;查看防火墙状态firewall-cmd --zonepublic --list-ports&#xff1a;查看所有打开的端口firew…

zabbix 监控 MogDB/openGauss 之 采集 prometheus 数据

zabbix 监控 MogDB/openGauss 之 采集 prometheus 数据 前言 市场上比较的监控方式有两种&#xff1a;zabbix 和 prometheus 架构&#xff0c;对于 MogDB/openGauss 数据库来说&#xff0c;已经通过grafana prometheus opengauss_exporter的方式完成了监控部署&#xff0c;…

html实体字符,已拿offer入职

面试知识点 主要内容包括html&#xff0c;css&#xff0c;前端基础&#xff0c;前端核心&#xff0c;前端进阶&#xff0c;移动端开发&#xff0c;计算机基础&#xff0c;算法与数据结构&#xff0c;设计模式&#xff0c;项目等等。 html 1.浏览器页面有哪三层构成&#xff0c…

ES-ES性能优化

缓存优化&#xff1a; 功能优化&#xff1a; 访问多&#xff1a;热层 访问少&#xff1a;温层 极少访问&#xff1a;第三方

【2024年最新】294地级市-地理相邻矩阵(名称版、行政代码版)

数据为同省下城市之间的相邻矩阵&#xff0c;表示同一省份内各个城市相互之间邻近关系。如果同一省份下两个城市相邻&#xff0c;矩阵中对应的矩阵值为1&#xff0c;否则&#xff0c;矩阵值为0 一、数据介绍 数据名称&#xff1a;地级市-地理相邻矩阵 数据范围&#xff1a;地…

leetcode刷题(javaScript)——二叉树、平衡二叉树相关场景题总结

二叉树的知识点很多&#xff0c;在算法刷题中需要有想象力的数据结构了。主要是用链表存储&#xff0c;没有数组更容易理解。在刷二叉树相关算法时&#xff0c;需要注意以下几点&#xff1a; 掌握二叉树的基本概念&#xff1a;了解二叉树的基本概念&#xff0c;包括二叉树的定义…

数据库(mysql)-新手笔记-基本知识点(1)

基本概念 数据库 Database :存储数据的容器 表 Table : 在数据库中存储的基本结构,它由行和列组成 行 Row : 表中的一条记录 列 Column : 表中的字段,定义了数据的类型和约束 数据类型 数据值 如 INT(整型),FLAOT(浮点型) ,DECIMAL (精确小数点) 字符串 如 VARCHAR(可变长度字…

记录linux C/C++ 宏定义 __FILE__、__LINE__、__FUNCTION__、__DATE__、__TIME__

1.1 __FILE__ 作用&#xff1a;表示当前源文件名&#xff0c;类型为字符串常量&#xff1b; #include <stdio.h> int main() { printf("%s\n", __FILE__); return 0; } 输出为&#xff1a; # ./test test.c 1.2 __LINE__ 作用&#xff1a;代表当前…

Hyperf代码目录规划尝试

app--|- Common 统一封装非业务|- Constants|- Controller|- Exception|- Kernel 统一封装业务|- Listener|- Model|- Process|- Request|- Service|- Task|- Util 工具 Helper和Util Util类&#xff0c;一般是无状态的&#xff0c;只包含静态方法。使用时无需创建类的实例。 …

[JavaWeb学习日记]JSP+Cookie+Filter与登录+CRUD案例

目录 一.JSP 二.EL表达式与JSTL标签 三.Cookie 四.Session 五.Filter 六. 登录CRUD:品牌增删改查案例 Demo一览 1.导包 2.构建包结构 3.创建数据库表tb_brand与user 4.创建实体类 5.mybatis的配置文件和logback配置文件 6.写接口 7.工具类&#xff1a;生成图片与…

leetcode.15三数之和

链接&#xff1a;https://leetcode.cn/problems/3sum 题目描述 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请返回所有和为 0 且不重复的三元组。…

信息抽取技术:电商领域的智能化革命与市场策略优化

一、引言 在当今快速发展的互联网电商领域&#xff0c;信息抽取技术的应用已经成为商家优化供应链、降低成本、提高响应速度的关键手段。随着消费者需求的日益多样化和个性化&#xff0c;电子商务平台需要更高效、智能的数据处理能力来应对市场的挑战。从供应商管理到库存优化…

[Latex]矩阵的三种关系(等价,相似,合同)的符号

\cong \sim \simeq 对应的Latex实现分别为&#xff1a; ≅ \cong ≅ ∼ \sim ∼ ≃ \simeq ≃

试一试点赞和收藏机制

如果你不是机器人&#xff0c;请在点赞或收藏的同时评论&#xff0c;内容为你最爱吃的食物