第五次-323场周赛
算法1:删除每行中的最大值(2500)
给你一个 m x n
大小的矩阵 grid
,由若干正整数组成。
执行下述操作,直到 grid
变为空矩阵:
- 从每一行删除值最大的元素。如果存在多个这样的值,删除其中任何一个。
- 将删除元素中的最大值与答案相加。
注意 每执行一次操作,矩阵中列的数据就会减 1 。
返回执行上述操作后的答案。
示例 1:
1 |
|
示例 2:
1 |
|
++++++++++++++
简单题
思路1:暴力做法,循环遍历每一行中的最大值,再拿出每一行中最大值的最大数。使用一个辅助变量来验证该数是否之前已经取过。
代码为:
1 |
|
思路2:很巧妙。我咋就没想到呢~~。将数组的每一行进行排序,相加每一列的最大的数就是结果
代码为
1 |
|
算法2:数组中最长的方波(2501)
给你一个整数数组 nums
。如果 nums
的子序列满足下述条件,则认为该子序列是一个 方波 :
- 子序列的长度至少为
2
,并且 - 将子序列从小到大排序 之后 ,除第一个元素外,每个元素都是前一个元素的 平方 。
返回nums
中 最长方波 的长度,如果不存在 方波 则返回-1
。
子序列 也是一个数组,可以由另一个数组删除一些或不删除元素且不改变剩余元素的顺序得到。
示例 1 :
1 |
|
示例 2 :
1 |
|
++++++++++++
中等题
思路:先对数组排序,再进行遍历搜索,在对每一个元素搜索的时候使用二分法进行查找。
代码为:
1 |
|
也可以使用封装好的二分法进行查找,代码为:
1 |
|
算法3:设计内存分配器(2502)
给你一个整数 n
,表示下标从 0 开始的内存数组的大小。所有内存单元开始都是空闲的。
请你设计一个具备以下功能的内存分配器:
- 分配 一块大小为
size
的连续空闲内存单元并赋 idmID
。 - 释放 给定 id
mID
对应的所有内存单元。
注意:
- 多个块可以被分配到同一个
mID
。 - 你必须释放
mID
对应的所有内存单元,即便这些内存单元被分配在不同的块中。
实现 Allocator
类:
Allocator(int n)
使用一个大小为n
的内存数组初始化Allocator
对象。int allocate(int size, int mID)
找出大小为size
个连续空闲内存单元且位于 最左侧 的块,分配并赋 idmID
。返回块的第一个下标。如果不存在这样的块,返回-1
。int free(int mID)
释放 idmID
对应的所有内存单元。返回释放的内存单元数目。
示例:
1 |
|
++++++++++++++++
中等题
思路:暴力
代码为
1 |
|
第五次-323场周赛
http://example.com/2022/12/17/第五次-323场周赛/