作者:
oin1104 (是oin的說)
2025-01-19 12:27:05我又進1000名了
家人們
我有一天會拿到Guardian 的
雖然可能要拿一輩子
一輩子...
Q1
每一個i-nums[i] 到 n的元素和
思路
照做
```cpp
class Solution {
public:
int subarraySum(vector<int>& nums)
{
int n = nums.size();
int res = 0;
for(int i = 0 ; i < n ; i ++)
{
int start = max(0 , i - nums[i]);
for(int j = start ; j <= i ; j ++)
{
res += nums[j];
}
}
return res;
}
};
```
Q2
最多k個元素的集合 不用連續
求他們的最大最小值的總合
思路
先sort之後就可以確定每次的最大最小值
然後就可以用C n取k 算出有多少組合
這些組合就是包含當前極值的所有集合
然後全部加起來
```cpp
class Solution {
public:
int minMaxSums(vector<int>& nums, int k)
{
long long res = 0;
int n = nums.size();
vector<vector<long long>> comb(n + 1, vector<long long>(k + 1, 0));
for (int i = 0; i <= n; i++) {
comb[i][0] = 1;
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= k; j++) {
if (j > i) break;
comb[i][j] = comb[i - 1][j - 1] + comb[i - 1][j];
comb[i][j] %= 1000000007;
}
}
sort(nums.begin() , nums.end());
for(int i = 0 ; i < n ; i ++)
{
for(int take = 0 ; take < min( k , n - i ) ; take ++)
{
long long now = nums[i] * comb[n-i-1][take] ;
now %= 1000000007;
res += now ;
res %= 1000000007;
}
}
for(int i = n-1 ; i >= 0 ; i