2021-12-29每日刷题打卡

2021-12-29每日刷题打卡

力扣——每日一题

1995. 统计特殊四元组

给你一个 下标从 0 开始 的整数数组 nums ,返回满足下述条件的 不同 四元组 (a, b, c, d) 的 数目 :

nums[a] + nums[b] + nums[c] == nums[d] ,且
a < b < c < d

示例 1:

输入:nums = [1,2,3,6]
输出:1
解释:满足要求的唯一一个四元组是 (0, 1, 2, 3) 因为 1 + 2 + 3 == 6 。

四重for暴力解

class Solution {
public:
    int countQuadruplets(vector<int>& nums) {
        int n=nums.size(),ans=0;
        for(int i=0;i<n;i++)
            for(int j=i+1;j<n;j++)
                for(int k=j+1;k<n;k++)
                    for(int l=k+1;l<n;l++)
                        if(nums[i]+nums[j]+nums[k]==nums[l])ans++;
        return ans;
    }
};

用哈希表,存下可能的d值,然后这样就只用遍历三个for就可以求出有多少四元组了。

class Solution {
public:
    int countQuadruplets(vector<int>& nums) {
        int n=nums.size(),ans=0;
        int arr[305]{};
        for(int k=n-2;k>=2;k--)
        {
            arr[nums[k+1]]++;
            for(int i=0;i<n;i++)
                for(int j=i+1;j<k;j++)
                    ans+=arr[nums[i]+nums[k]+nums[j]];
        }
        return ans;
    }
};
1619. 删除某些元素后的数组均值

给你一个整数数组 arr ,请你删除最小 5% 的数字和最大 5% 的数字后,剩余数字的平均值。

与 标准答案 误差在 10-5 的结果都被视为正确结果。

示例 1:

输入:arr = [1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3]
输出:2.00000
解释:删除数组中最大和最小的元素后,所有元素都等于 2,所以平均值为 2 。

先计算要删去的数n,然后从第n处开始遍历数组,到arr.size()-n处停下,来计算这段的和sum,然后除于元素的数量来求得平均值。

class Solution {
public:
    double trimMean(vector<int>& arr) {
        sort(arr.begin(),arr.end());
        int n=arr.size()*0.05,len=arr.size();
        double ave=0,sum=0;
        for(int i=n;i<len-n;i++)
            sum+=arr[i];
        ave=sum/(len-2*n);
        return ave;
    }
};
1491. 去掉最低工资和最高工资后的工资平均值

给你一个整数数组 salary ,数组里每个数都是 唯一 的,其中 salary[i] 是第 i 个员工的工资。

请你返回去掉最低工资和最高工资以后,剩下员工工资的平均值。

示例 1:

输入:salary = [4000,3000,1000,2000]
输出:2500.00000
解释:最低工资和最高工资分别是 1000 和 4000 。
去掉最低工资和最高工资以后的平均工资是 (2000+3000)/2= 2500

对数组排序后,从第二个元素开始遍历,到倒数第二个元素结束,计算其中的元素总和并算出平均值。

class Solution {
public:
    double average(vector<int>& salary) {
        sort(salary.begin(),salary.end());
        double sum=0;
        int n=salary.size();
        for(int i=1;i<n-1;i++)
            sum+=salary[i];
        return sum/(n-2);
    }
};
1608. 特殊数组的特征值

给你一个非负整数数组 nums 。如果存在一个数 x ,使得 nums 中恰好有 x 个元素 大于或者等于 x ,那么就称 nums 是一个 特殊数组 ,而 x 是该数组的 特征值 。

注意: x 不必 是 nums 的中的元素。

如果数组 nums 是一个 特殊数组 ,请返回它的特征值 x 。否则,返回 -1 。可以证明的是,如果 nums 是特殊数组,那么其特征值 x 是 唯一的 。

示例 1:

输入:nums = [3,5]
输出:2
解释:有 2 个元素(3 和 5)大于或等于 2 。

先对数组降序排序,然后开始while遍历,从i=0开始,如果nums[i]>=i+1,则i++;如果不满足,就判断这个元素是否大于等于i,如果满足,说明特征值不对(因为我们是每有一个数,特征值就++,但如果有i+1个数大于等于i,则不满足特征值的条件(因为数组从0开始,所以是i+1个数)),返回-1,如果不满足就返回i;

class Solution {
public:
    void quick_sort(vector<int>&nums,int l,int r)
    {
        if(l>=r)return;
        int x=nums[(l+r)/2],i=l-1,j=r+1;
        while(i<j)
        {
            do i++;while(nums[i]>x);
            do j--;while(nums[j]<x);
            if(i<j)swap(nums[i],nums[j]);
        }
        quick_sort(nums,l,j);
        quick_sort(nums,j+1,r);
    }
    int specialArray(vector<int>& nums) {
        int n=nums.size();
        quick_sort(nums,0,n-1);
        int i=0;
        while(i<n)
        {
            if(nums[i]>=i+1)
                i++;
            else
            {
                if(nums[i]>=i)return -1;
                else return i;
            }
        }
        return i;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值