LeetCode 3355.零数组变换 I:差分数组

【LetMeFly】3355.零数组变换 I:差分数组

力扣题目链接:https://leetcode.cn/problems/zero-array-transformation-i/

给定一个长度为 n 的整数数组 nums 和一个二维数组 queries,其中 queries[i] = [li, ri]

对于每个查询 queries[i]

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

零数组是指所有元素都等于 0 的数组。

如果在按顺序处理所有查询后,可以将 nums 转换为 零数组 ,则返回 true,否则返回 false

示例 1:
输入: nums = 1,0,1, queries = \[0,2]

输出: true

解释:

  • 对于 i = 0:

    复制代码
    <ul>
    	<li>选择下标子集 <code>[0, 2]</code> 并将这些下标处的值减 1。</li>
    	<li>数组将变为 <code>[0, 0, 0]</code>,这是一个零数组。</li>
    </ul>
    </li>

示例 2:
输入: nums = 4,3,2,1, queries = \[1,3,0,2]

输出: false

解释:

  • 对于 i = 0:

    复制代码
    <ul>
    	<li>选择下标子集 <code>[1, 2, 3]</code> 并将这些下标处的值减 1。</li>
    	<li>数组将变为 <code>[4, 2, 1, 0]</code>。</li>
    </ul>
    </li>
    <li><strong>对于 i = 1:</strong>
    <ul>
    	<li>选择下标子集 <code>[0, 1, 2]</code> 并将这些下标处的值减 1。</li>
    	<li>数组将变为 <code>[3, 1, 0, 0]</code>,这不是一个零数组。</li>
    </ul>
    </li>

提示:

  • 1 <= nums.length <= 105
  • 0 <= nums[i] <= 105
  • 1 <= queries.length <= 105
  • queries[i].length == 2
  • 0 <= li <= ri < nums.length

解题方法:差分数组

创建一个 o p op op数组,假设某个query是从 0 0 0到 3 3 3,那么就将 o p 0 op0 op0到 o p 3 op3 op3都加一(代表下标 0 0 0到 3 3 3都可以被操作一次),其中 o p i opi opi代表 n u m s i numsi numsi一共被操作多少次。

创建一个 d i f f diff diff数组,其中 d i f f i diffi diffi代表数组 o p i − o p i − 1 opi-opi-1 opi−opi−1差值

假设想让 o p l opl opl到 o p r opr opr都加一,那么其实只需要 d i f f l diffl diffl加一 d i f f r + 1 diffr + 1 diffr+1减一, o p op op数组直接扔了都行。

执行完所有操作(更新好diff数组)后, ∑ 0 i d i f f i \sum_0^i diffi ∑0idiffi即为 o p i opi opi的值。

如果存在任何一个 i i i的 n u m s i > o p i numsi\gt opi numsi>opi,就说明 n u m s i numsi numsi无法减为 0 0 0,返回false

  • 时间复杂度 O ( l e n ( q u e r i e s ) + l e n ( n u m s ) ) O(len(queries)+len(nums)) O(len(queries)+len(nums))
  • 空间复杂度 O ( l e n ( n u m s ) ) O(len(nums)) O(len(nums))

AC代码

C++
cpp 复制代码
/*
 * @Author: LetMeFly
 * @Date: 2025-05-21 23:06:35
 * @LastEditors: LetMeFly.xyz
 * @LastEditTime: 2025-05-21 23:14:28
 */
class Solution {
public:
    bool isZeroArray(vector<int>& nums, vector<vector<int>>& queries) {
        vector<int> diff(nums.size() + 1);
        for (vector<int>& q : queries) {
            diff[q[0]]++;
            diff[q[1] + 1]--;
        }
        int cnt = 0;
        for (int i = 0; i < nums.size(); i++) {
            cnt += diff[i];
            if (nums[i] > cnt) {
                return false;
            }
        }
        return true;
    }
};
Python
python 复制代码
'''
Author: LetMeFly
Date: 2025-05-21 23:06:35
LastEditors: LetMeFly.xyz
LastEditTime: 2025-05-21 23:19:48
'''
from typing import List

class Solution:
    def isZeroArray(self, nums: List[int], queries: List[List[int]]) -> bool:
        diff = [0] * (len(nums) + 1)
        for l, r in queries:
            diff[l] += 1
            diff[r + 1] -= 1
        cnt = 0
        for i in range(len(nums)):
            cnt += diff[i]
            if nums[i] > cnt:
                return False
        return True
Java
java 复制代码
/*
 * @Author: LetMeFly
 * @Date: 2025-05-21 23:06:35
 * @LastEditors: LetMeFly.xyz
 * @LastEditTime: 2025-05-21 23:20:50
 */
class Solution {
    public boolean isZeroArray(int[] nums, int[][] queries) {
        int[] diff = new int[nums.length + 1];
        for (int[] q : queries) {
            diff[q[0]]++;
            diff[q[1] + 1]--;
        }
        int cnt = 0;
        for (int i = 0; i < nums.length; i++) {
            cnt += diff[i];
            if (nums[i] > cnt) {
                return false;
            }
        }
        return true;
    }
}
Go
go 复制代码
/*
 * @Author: LetMeFly
 * @Date: 2025-05-21 23:06:35
 * @LastEditors: LetMeFly.xyz
 * @LastEditTime: 2025-05-21 23:23:00
 */
package main

func isZeroArray(nums []int, queries [][]int) bool {
    diff := make([]int, len(nums) + 1)
    for _, q := range queries {
        diff[q[0]]++
        diff[q[1] + 1]--
    }
    cnt := 0
    for i := 0; i < len(nums); i++ {
        cnt += diff[i]
        if nums[i] > cnt {
            return false
        }
    }
    return true
}

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

相关推荐
折哥的程序人生 · 物流技术专研1 小时前
Java面试85题图解版 · 特别篇:2026后端高频面试题复盘(算法底层逻辑+高并发架构设计全解析,附Java实战代码)
java·网络·数据库·算法·面试
想吃火锅10053 小时前
【leetcode】14.最长公共前缀js
算法·leetcode·职场和发展
云絮.4 小时前
数据库操作
数据库·mysql·算法·oracle
小林ixn4 小时前
LeetCode 206. 反转链表(迭代 + 递归详解)
算法·leetcode·链表
凡人叶枫4 小时前
Effective C++ 条款17:以独立语句将 newed 对象置入智能指针
java·linux·开发语言·c++·算法
菜鸟‍6 小时前
LeetCode 1 27 和 704 || 两数之和 移除元素 二分查找
算法·leetcode·职场和发展
退休倒计时7 小时前
【每日一题】LeetCode 142. 环形链表 II TypeScript
算法·leetcode·链表·typescript
popcorn_min7 小时前
Digits 手写数字识别:随机森林多分类 + 像素级特征热力图
算法·随机森林·分类
liulilittle8 小时前
拥塞控制:排水终止的两种决策:OR 与 AND
网络·tcp/ip·计算机网络·算法·信息与通信·tcp·通信
weixin_307779138 小时前
从脚本执行到智能体协作:AI辅助测试能力的范式重构
运维·开发语言·人工智能·算法·测试用例