Java&C++题解与拓展——leetcode2028.找出缺失的观测数据【vector学习与使用】

每日一题做题记录,参考官方和三叶的题解

题目要求

在这里插入图片描述

思路

可以算出丢失的 n n n个值之和 s u m sum sum,然后构造一个加起来恰好得 s u m sum sum的数组res即可【 ∑ i = 0 n r e s [ i ] = s u m \sum_{i=0}^nres[i]=sum i=0nres[i]=sum】。

  • r e s [ i ] ∈ [ 1 , 6 ] res[i] \in [1,6] res[i][1,6],所以 s u m ∈ [ n , 6 ∗ n ] sum \in [n,6*n] sum[n,6n],否则无解返回空数组;
  • 有解的时候,一定可以构造出一个包含 a a a ⌊ s u m n ⌋ \lfloor\frac{sum}{n}\rfloor nsum n − a n-a na ⌊ s u m n ⌋ + 1 \lfloor\frac{sum}{n}\rfloor + 1 nsum+1的结果。那么将res填充为 ⌊ s u m n ⌋ \lfloor\frac{sum}{n}\rfloor nsum,然后计算需要补 1 1 1的数量,也就是 s u m sum sum ⌊ s u m n ⌋ ∗ n \lfloor\frac{sum}{n}\rfloor*n nsumn的差值 d i s dis dis,将这些 1 1 1加在res d i s dis dis个数上。

Java

class Solution {
    public int[] missingRolls(int[] rolls, int mean, int n) {
        int m = rolls.length, cnt = m + n;
        int sum = mean * cnt;
        for(int i : rolls)
            sum -= i;
        if(sum < n || sum > 6 * n)
            return new int[0];
        int[] res = new int[n];
        //构造结果
        Arrays.fill(res, sum / n);
        //保证整除
        if(sum / n * n < sum) {
            int dis = sum - (sum / n * n), idx = 0;
            while(dis-- > 0)
                res[idx++]++;
        }
        return res;
    }
}
  • 时间复杂度: O ( m + n ) O(m + n) O(m+n)
  • 空间复杂度: O ( n ) O(n) O(n)

C++

class Solution {
public:
    vector<int> missingRolls(vector<int>& rolls, int mean, int n) {
        int m = rolls.size(), cnt = m + n;
        int sum = mean * cnt;
        for(int i : rolls)
            sum -= i;
        if(sum < n || sum > 6 * n)
            return {};
        //构造结果
        vector<int> res(n, sum / n);
        //保证整除
        if(sum / n * n < sum) {
            int dis = sum - (sum / n * n), idx = 0;
            while(dis-- > 0)
                res[idx++]++;
        }
        return res;
    }
};
  • 时间复杂度: O ( m + n ) O(m + n) O(m+n)
  • 空间复杂度: O ( n ) O(n) O(n)

vector

  • 学习参考链接
  • 前两天刚学习整理过,今天主要是学习一下如何快速插入多个相同的元素。
  • 如何添加 c n t cnt cnt v a l val val参考
    • 初始化时直接添加:
    std::vector<int> res(cnt, val);
    
    • insert函数
    res.insert(res.end(), cnt, val);//在末尾添加
    

总结

题目思路不难,主要是想好如何构造能整除的答案。


欢迎指正与讨论!
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值