leetcode每日一题 2022-09-14 1619. 删除某些元素后的数组均值
本题也是水题一道(不知道为什么leetcode每日一题总是简单题)
将arr排序后求取n/20 ~ 19n/20 的平均值。
class Solution {
public:
double trimMean(vector<int>& arr) {
sort(arr.begin(),arr.end());
int n=arr.size();
int Sum = accumulate(arr.begin() + n / 20, arr.begin() + (19 * n / 20), 0);
return Sum / (n * 0.9);
}
};
再附加一道题:
1975. 最大方阵和
这道题目也是非常有意思了,如果带着要一步步走,一步步试验的思路的话那肯定是太复杂了。
所以这道题需要另辟蹊径,找到一定的规律。
首先需要验证这个游戏中的“定理”
- 对于任意两个负数(不一定相邻),一定可以使他们变成正数
选择出一条连接两负数的路径,沿着该路径不断给相邻元素乘-1,就可以让这两个负数变正。 - 推广一下:有偶数个负数的话,他们都可以变成正数。
- 与1类似的思路,对于一个正数一个负数,一定可以将他们互换正负。
- 推广一下 : 只要存在负数,这个负号可以赋给任何一个数。
- 当出现一个负数一个0 时,和1 同样的思路,可以将负数化正。
- 推广下来,只要有0 时,就可以将所有数变为非负。
综上所述:
有0时,所有数为非负数。
没有0时,奇数个负数就一定会剩下一个负数。这个负号可以给任意元素。
偶数个奇数就可以使得全体为非负数。
class Solution {
public:
long long maxMatrixSum(vector<vector<int>>& matrix) {
long long ans =0;
bool zero_val=0;
int neg=0; //判断多少个负数.
int min_int=abs(matrix[0][0]);
for(int i=0;i<matrix.size();i++)
{
for(int j=0;j<matrix[0].size();j++)
{
if(matrix[i][j]<0)
neg+=1;
else if(matrix[i][j]==0)
{
zero_val=1;
}
if(abs(matrix[i][j])<min_int)
min_int=abs(matrix[i][j]);
ans+=abs(matrix[i][j]);
}
}
if(zero_val==1 || neg%2==0)
return ans;
else
return ans-2*min_int;
}
};```