【Leetcode 每日一题】3355. 零数组变换 I

问题背景

给定一个长度为 nnn 的整数数组 numsnumsnums 和一个二维数组 queriesqueriesqueries,其中 queries[i]=[li,ri]queries[i] = [l_i, r_i]queries[i]=[li,ri]
对于每个查询 queries[i]queries[i]queries[i]

  • numsnumsnums 的下标范围 [li,ri][l_i, r_i][li,ri] 内选择一个下标 子集。
  • 将选中的每个下标对应的元素值减 111

零数组 是指所有元素都等于 000 的数组。
如果在按顺序处理所有查询后,可以将 numsnumsnums 转换为 零数组 ,则返回 truetruetrue,否则返回 falsefalsefalse

数据约束

  • 1≤nums.length≤1051 \le nums.length \le 10 ^ 51nums.length105
  • 0≤nums[i]≤1050 \le nums[i] \le 10 ^ 50nums[i]105
  • 1≤queries.length≤1051 \le queries.length \le 10 ^ 51queries.length105
  • queries[i].length=2queries[i].length = 2queries[i].length=2
  • 0≤li≤ri<nums.length0 \le l_i \le r_i < nums.length0liri<nums.length

解题过程

由于操作的过程中可以选择子集,所以实际上问题可以转化为能否对范围上的数进行操作,使得所有元素均非正。
而对某个区间上的所有元素进行某种同样的操作,可以用差分来实现。

具体实现

class Solution {
    public boolean isZeroArray(int[] nums, int[][] queries) {
        int n = nums.length;
        int[] diff = new int[n + 1];
        for (int[] query : queries) {
            diff[query[0]]++;
            diff[query[1] + 1]--;
        }
        int num = 0;
        for (int i = 0; i < n; i++) {
            num += diff[i];
            if (nums[i] > num) {
                return false;
            }
        }
        return true;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值