leetcode每日一题 2022-09-14 1619. 删除某些元素后的数组均值 1975.最大方阵和

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,就可以让这两个负数变正。
  2. 推广一下:有偶数个负数的话,他们都可以变成正数。
  3. 与1类似的思路,对于一个正数一个负数,一定可以将他们互换正负。
  4. 推广一下 : 只要存在负数,这个负号可以赋给任何一个数。
  5. 当出现一个负数一个0 时,和1 同样的思路,可以将负数化正。
  6. 推广下来,只要有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;
    }
};```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值