题目:3355. 零数组变换 I
思路:差分数组+前缀和,时间复杂度0(n)。
C++版本:
class Solution {
public:
bool isZeroArray(vector<int>& nums, vector<vector<int>>& queries) {
int n=nums.size();
//差分数组,0(1)的复杂度解决范围区间增加的问题
vector<int> v(n+1,0);
for(auto &x:queries){
v[x[0]]++;
v[x[1]+1]--;
}
//前缀和,求出每个位置可以减少的次数
for(int i=1;i<n;i++){
v[i]+=v[i-1];
}
bool flag=true;
for(int i=0;i<n;i++){
//有一个位置,不能减小到0就是false
if(v[i]<nums[i]){
flag=false;
break;
}
}
return flag;
}
};
JAVA版本:
class Solution {
public boolean isZeroArray(int[] nums, int[][] queries) {
int n=nums.length;
int[] v=new int[n+1];
for(var x:queries){
v[x[0]]++;
v[x[1]+1]--;
}
for(int i=1;i<n;i++){
v[i]+=v[i-1];
}
boolean flag=true;
for(int i=0;i<n;i++){
if(v[i]<nums[i]){
flag=false;
break;
}
}
return flag;
}
}
Go版本:
func isZeroArray(nums []int, queries [][]int) bool {
n:=len(nums)
v:=make([]int,n+1)
for _,x:= range queries {
v[x[0]]++
v[x[1]+1]--
}
for i:=1;i<n;i++ {
v[i]+=v[i-1]
}
flag := true
for i:=0;i<n;i++ {
if v[i]<nums[i] {
flag=false
break
}
}
return flag
}