Every day a Leetcode
题目来源:2772. 使数组中的所有元素都等于零
解法1:差分数组
令差分数组 diff[i] = nums[i] - nums[i - 1],特别地,diff[0] = nums[0],diff[n] = -nums[n-1]。
可以发现,差分数组具有以下性质:
- 原数组中所有元素都等于零,等价于差分数组中所有元素都等于零。
- 如果我们将原数组中以 nums[i] 为开头且长度为 k 的子数组中每个元素 -1,等价于 diff[i]-1,diff[i+k]+1。这样我们就将子数组的运算转化为了单个元素的运算。
考虑 diff[i](0<=i<=n-k):
- 如果 diff[i]<0,因为不存在下标 −k 所以无解。
- 如果 diff[i]>0,我们需要对 diff[i] 进行 -1 操作把它变成 0,同时将 diff[i+k] += diff[i]。
最后遍历数组 diff,全为 0 返回 true,否则返回 false。
代码:
/*
* @lc app=leetcode.cn id=2772 lang=cpp
*
* [2772] 使数组中的所有元素都等于零
*/
// @lc code=start
// 差分数组
class Solution
{
public:
bool checkArray(vector<int> &nums, int k)
{
int n = nums.size();
// 计算差分数组
vector<int> diff(n + 1, 0);
diff[0] = nums[0];
for (int i = 1; i < n; i++)
diff[i] = nums[i] - nums[i - 1];
diff[n] = -nums[n - 1];
// 从左到右对差分数组里的每个元素进行操作
for (int i = 0; i + k <= n; i++)
if (diff[i] > 0)
{
diff[i + k] += diff[i];
diff[i] = 0;
}
// 检查差分数组中是否所有元素均为 0
for (int i = 0; i <= n; i++)
if (diff[i] != 0)
return false;
return true;
}
};
// @lc code=end
结果:
复杂度分析:
时间复杂度:O(n),其中 n 是数组 nums 的元素个数。
空间复杂度:O(n),其中 n 是数组 nums 的元素个数。