Every day a Leetcode
解法1:贪心 + 哈希
从 1 开始枚举数 x,如果 k - x 不在哈希表里,说明可以插入 k-avoiding 数组,sum 加上 x,向哈希表插入 x。
当哈希表中有 n 个元素时,退出,返回 sum。
代码:
c
/*
* @lc app=leetcode.cn id=2829 lang=cpp
*
* [2829] k-avoiding 数组的最小总和
*/
// @lc code=start
// 贪心 + 哈希
class Solution
{
public:
int minimumSum(int n, int k)
{
unordered_set<int> visited;
int sum = 0, count = 0;
for (int x = 1; x <= 2 * n; x++)
{
if (!visited.count(k - x))
{
sum += x;
count++;
if (count == n)
break;
visited.insert(x);
}
}
return sum;
}
};
// @lc code=end
结果:
复杂度分析:
时间复杂度:O(n)。
空间复杂度:O(n)。
解法2:数学
代码:
c
// 数学
class Solution
{
public:
int minimumSum(int n, int k)
{
int m = min(k / 2, n);
return (m * (m + 1) + (k * 2 + n - m - 1) * (n - m)) / 2;
}
};
结果:
复杂度分析:
时间复杂度:O(1)。
空间复杂度:O(1)。