Leetcode 2772. 使数组中的所有元素都等于零
https://leetcode.cn/problems/apply-operations-to-make-all-array-elements-equal-to-zero/description/
给你一个下标从 0 开始的整数数组 nums 和一个正整数 k 。
你可以对数组执行下述操作 任意次 :
从数组中选出长度为 k 的 任一 子数组,并将子数组中每个元素都 减去 1 。
如果你可以使数组中的所有元素都等于 0 ,返回 true ;否则,返回 false 。
子数组 是数组中的一个非空连续元素序列。
示例 1:
输入:nums = [2,2,3,1,1,0], k = 3
输出:true
解释:可以执行下述操作:
- 选出子数组 [2,2,3] ,执行操作后,数组变为 nums = [1,1,2,1,1,0] 。
- 选出子数组 [2,1,1] ,执行操作后,数组变为 nums = [1,1,1,0,0,0] 。
- 选出子数组 [1,1,1] ,执行操作后,数组变为 nums = [0,0,0,0,0,0] 。
示例 2:
输入:nums = [1,3,1,1], k = 2
输出:false
解释:无法使数组中的所有元素等于 0 。
提示:
1 <= k <= nums.length <= 10^5
0 <= nums[i] <= 10^6
数组转化成差分数组
根据差分的定义 长度为k的数组元素一同操作 则等于a[i]+=x a[i+k]-=x
从左到右 已经处理的元素不涉及后面的元素处理 如果任意遍历到的差分数组元素无法处理 则原数组不可能完成要求
class Solution {
public:
bool checkArray(vector<int>& nums, int k) {
int arr[100010];memset(arr,0,sizeof arr);
nums.insert(nums.begin(),0);
//制作差分数组
for(int i= 1;i<nums.size();i++){
arr[i] = nums[i]-nums[i-1];
}
//如果差分数组最后全为0 则说明符合求
//从左到右 已经处理的元素不涉及后面的元素处理
// 当前元素>0 则进行差分数组 a[i]-=x a[i+k]+=x 处理,等于原数组 K长度的元素统一减去x
// 当前元素 <0 说明原数组K距离内前面元素大后面元素下 但是数组操作只有减没有加, 则无法处理 返回false 9 2 8 1, k=2
// 当前元素>0 但是到结尾没有k长度 也无法处理 返回false 比如 1 1 1 8 K=4 的例子
for(int i =0;i < nums.size();i++){
if(arr[i]>0 && i+k <= nums.size()){
int nn = arr[i];
arr[i] -=nn;
arr[i+k] += nn;
}else if(arr[i] != 0){return false;}
}
return true;
}
};
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
浙公网安备 33010602011771号