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;}// 检查差分数组中是否所有元素均为 0for (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 的元素个数。