每日一题做题记录,参考官方和三叶的题解 |
题目要求
思路
可以算出丢失的
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,6∗n],否则无解返回空数组;
- 有解的时候,一定可以构造出一个包含
a
a
a个
⌊
s
u
m
n
⌋
\lfloor\frac{sum}{n}\rfloor
⌊nsum⌋和
n
−
a
n-a
n−a个
⌊
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 ⌊nsum⌋∗n的差值 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);//在末尾添加
总结
题目思路不难,主要是想好如何构造能整除的答案。
欢迎指正与讨论! |