携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情
T1
题目描述
给定一个数组,数组中的元素非负,要求在每次的操作中选出一个正整数x,x需要小于或等于数组中最小的非零元素,在每步的操作中将数组中非零的数减去所选的整数x,要求返回需要最小的操作次数,使得数组中的元素都为0;
例1:输入:"[2,9,11,2,0]" 输出:"3"
解释:第一次选择 2 后,数组变为[0,7,9,0,0]。第二次选择 7 后,数组变为[0,0,2,0,0]。第三次选择 2 后数组变为[0,0,0,0,0],所以最少进行操作三次才能把数组全部元素置为 0 。
本题值得注意的地方
- 数组中的元素大小范围 1 ~ 100
- 数组长度范围 1 ~ 100
原题地址:6132. 使数组中所有元素都等于零
解题思路
根据题目的意思可知,要想操作的次数最少,每次选择的数x必定为当前数组中的最小的非零数,而选择的次数即为数组中除零之外不同元素的个数,因为每进行减去一次,相同的元素减去x后结果也相同。这里选择利用 map 来统计不同元素的个数。
实现代码
class Solution {
public:
int minimumOperations(vector<int>& nums) {
unordered_map<int,int> map;
int res=0;
for(int i=0;i<nums.size();i++){
if(nums[i]!=0 && map.count(nums[i]) == 0) res++;
map[nums[i]]++;
}
return res;
}
};
T2
题目描述
给定一个元素为正整数的数组grades,表示一些学生信息,现在要求对所有的学生进行分组。返回可以形成的最大组数。
其各组之间满足的顺序应该满足:后一个组中的学生总成绩以及学生人数都要不小于前一个组的学生总成绩和人数。
例1:输入:"[9,6,10,7,2,5]" 输出:"3"
解释:第一组选择[10],第二组选择[6,5],第三组选择[2,9,7]。
本题值得注意的地方
- 数组中的元素大小范围 1 ~ 1e5
- 数组长度范围 1 ~ 1e5
解题思路
在学生人数一定的情况下,必定是优先对成绩低的学生进行分组,这样后续分组时就不会发生学生人数比前一个组的多但学生的总成绩比前一个组的少的情况。我们可以在心里默默的给数组进行排序,排序后,在分组时只要考虑学生人数的问题。
所以该题就演变为对学生进行分组,每组中的人数为1、2、3、4······,计算能够形成的最大组数。
实现代码
class Solution {
public:
int maximumGroups(vector<int>& grades) {
// 最大组数
int maxres = 0;
for(maxres;maxres*(maxres+1) <= 2*grades.size();maxres++) ;
return maxres-1;
}
};