力扣热题——零数组变换 |

目录

[题目链接:3355. 零数组变换 I - 力扣(LeetCode)](#题目链接:3355. 零数组变换 I - 力扣(LeetCode))

题目描述

解法一:前缀和

解决思路

Java写法:

C++写法:

运行时间

时间复杂度和空间复杂度

解法二:

Java写法:

C++写法:

运行时间

时间复杂度和空间复杂度

总结


题目链接:3355. 零数组变换 I - 力扣(LeetCode)

注:下述题目描述和示例均来自力扣

题目描述

给定一个长度为 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:
    • 选择下标子集 [0, 2] 并将这些下标处的值减 1。
    • 数组将变为 [0, 0, 0],这是一个零数组。

示例 2:

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

输出: false

解释:

  • 对于 i = 0:
    • 选择下标子集 [1, 2, 3] 并将这些下标处的值减 1。
    • 数组将变为 [4, 2, 1, 0]
  • 对于 i = 1:
    • 选择下标子集 [0, 1, 2] 并将这些下标处的值减 1。
    • 数组将变为 [3, 1, 0, 0],这不是一个零数组。

提示:

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

解法一:前缀和

解决思路

该问题的核心在于判断每个元素能否通过查询操作被足够次数地减1,最终变为0。关键在于​​每个元素被覆盖的查询次数必须至少等于其初始值​​。具体思路如下:

  1. ​差分数组统计覆盖次数​

    使用差分数组高效统计每个元素被查询区间覆盖的次数。对于每个查询区间 [l, r],在差分数组 diff[l] 处加1,diff[r+1] 处减1。通过前缀和计算每个位置的实际覆盖次数。

  2. ​验证覆盖次数是否足够​

    遍历每个元素,若其被覆盖的次数小于初始值,则无法通过操作归零,返回 false;否则返回 true

Java写法:

java 复制代码
public class Solution {
    public boolean isZeroArray(int[] nums, int[][] queries) {
        int n = nums.length;
        int[] diff = new int[n + 1];
        // 构建差分数组
        for (int[] q : queries) {
            int l = q[0], r = q[1];
            diff[l]++;
            if (r + 1 < n) { // 防止越界
                diff[r + 1]--;
            }
        }
        // 计算前缀和并验证
        int current = 0;
        for (int i = 0; i < n; i++) {
            current += diff[i];
            if (current < nums[i]) {
                return false;
            }
        }
        return true;
    }
}

C++写法:

cpp 复制代码
#include <vector>
using namespace std;

class Solution {
public:
    bool isZeroArray(vector<int>& nums, vector<vector<int>>& queries) {
        int n = nums.size();
        vector<int> diff(n + 1, 0);
        // 构建差分数组
        for (auto& q : queries) {
            int l = q[0], r = q[1];
            diff[l]++;
            if (r + 1 <= n) { // 确保不越界
                diff[r + 1]--;
            }
        }
        // 计算前缀和并验证
        int current = 0;
        for (int i = 0; i < n; ++i) {
            current += diff[i];
            if (current < nums[i]) {
                return false;
            }
        }
        return true;
    }
};

运行时间

时间复杂度和空间复杂度

  • ​时间复杂度​O(n + q),其中 n 为数组长度,q 为查询数量。差分数组构建和前缀和计算各需线性时间。
  • ​空间复杂度​O(n),差分数组额外占用 n+1 空间。



总结

本文介绍了力扣题目"零数组变换I"的解法,核心在于判断数组能否通过一系列查询操作归零。解法一采用前缀和与差分数组技术,高效统计每个元素被查询区间覆盖的次数,并验证是否足够使其归零。文章提供了Java和C++的实现代码,并分析了时间复杂度和空间复杂度。时间复杂度为O(n+q),空间复杂度为O(n),适用于大规模数据处理。通过这种方法,能够快速判断数组是否可以通过给定查询操作转换为零数组。

相关推荐
老赵聊算法、大模型备案3 小时前
北京市生成式人工智能服务已备案信息公告(2025年12月11日)
人工智能·算法·安全·aigc
CoderYanger4 小时前
C.滑动窗口-求子数组个数-越长越合法——2799. 统计完全子数组的数目
java·c语言·开发语言·数据结构·算法·leetcode·职场和发展
厕所博士4 小时前
红黑树原理前置理解—— 2-3 树
算法·2-3树·红黑树原理理解前置
萌>__<新5 小时前
力扣打卡每日一题————除自身外所有元素的乘积
数据结构·算法
xu_yule5 小时前
算法基础—搜索(2)【记忆化搜索+BFS+01BFS+Floodfill]
数据结构·算法
s09071365 小时前
Xilinx FPGA使用 FIR IP 核做匹配滤波时如何减少DSP使用量
算法·fpga开发·xilinx·ip core·fir滤波
老马啸西风5 小时前
成熟企业级技术平台-10-跳板机 / 堡垒机(Bastion Host)详解
人工智能·深度学习·算法·职场和发展
子夜江寒5 小时前
逻辑回归简介
算法·机器学习·逻辑回归
软件算法开发6 小时前
基于ACO蚁群优化算法的多车辆含时间窗VRPTW问题求解matlab仿真
算法·matlab·aco·vrptw·蚁群优化·多车辆·时间窗
another heaven6 小时前
【软考 磁盘磁道访问时间】总容量等相关案例题型
linux·网络·算法·磁盘·磁道