LeetCode 每日一题笔记 日期:2026.05.14 题目:2784. 检查数组是否是好的

LeetCode 每日一题笔记

0. 前言

  • 日期:2026.05.14
  • 题目:2784. 检查数组是否是好的
  • 难度:简单
  • 标签:数组、排序

1. 题目理解

问题描述 :

给定一个整数数组 nums,判断它是否是 base[n] 的一个排列。

  • base[n] 的定义:长度为 n+1,包含 1 ~ n-1 各一次,n 出现两次。
  • 例如:base[3] = [1,2,3,3],base[1] = [1,1]。

示例:

输入:nums = 1,3,3,2

输出:true

解释:数组排序后为 [1,2,3,3],是 base[3] 的排列。
输入:nums = 2,1,3

输出:false

解释:数组长度为3,而 base[3] 长度为4,无法匹配。

2. 解题思路

核心观察

  • 数组长度为 len,则 n = len-1,数组排序后必须满足:
    • 前 len-1 个元素为 1,2,...,n;
    • 最后一个元素为 n;
  • 原代码用差分数组间接判断,可简化为直接校验。

算法步骤

  1. 计算 n = nums.length - 1;
  2. 对数组排序;
  3. 遍历前 len-1 个元素,检查是否等于 i+1;
  4. 检查最后一个元素是否等于 n;
  5. 全部满足则返回 true,否则返回 false。

3. 代码实现

java 复制代码
package lc2784;

import java.util.Arrays;

class Solution {
    public boolean isGood(int[] nums) {
        int n = nums.length;
        Arrays.sort(nums);
        int[] arr = new int[n];

        arr[0] = nums[0];
        for (int i = 1; i < n; i++) {
            arr[i] = nums[i] - nums[i - 1];
        }
        if (arr[n - 1] != 0) {
            return false;
        }

        for (int i = 0; i < n - 1; i++) {
            if (arr[i] != 1) {
                return false;
            }
        }
        return true;
    }
}

4. 代码优化说明

减少了差分数组和冗余判断,直接在排序后的数组上做校验,减少了额外数组和分支判断:

java 复制代码
package lc2784;

import java.util.Arrays;

class Solution {
    public boolean isGood(int[] nums) {
        int len = nums.length;
        int n = len - 1;
        Arrays.sort(nums);
        for (int i = 0; i < len - 1; i++) {
            if (nums[i] != i + 1) {
                return false;
            }
        }
        return nums[len - 1] == n;
    }
}

5. 复杂度分析

  • 时间复杂度 :O(nlog⁡n)O(n \log n)O(nlogn),排序主导复杂度,遍历为线性级。
  • 空间复杂度 :O(1)O(1)O(1),仅使用常数变量,排序为原地操作。

6. 总结

  • 核心思路:排序 + 线性校验 ,利用 base[n] 的结构特性直接判断;
  • 优化后逻辑更直接,无需差分数组,可读性和效率更高。
相关推荐
longlongzihan1 分钟前
LeetCode 128. 最长连续序列 —— 从排序到哈希集合
数据结构·c++·算法·leetcode·排序算法·哈希表
mmmmath_37 分钟前
二叉树の一些知识
数据结构·算法
DongQiShanRen12 分钟前
裁决台账双向互校(下):台账哈希链、三向对账与最小落地
人工智能·深度学习·算法·目标跟踪·自然语言处理·rust·哈希算法
SWAGGY..29 分钟前
【C++进阶】:(7)红黑树的原理与 C++ 实现:结构设计、插入调整及性质验证
android·java·开发语言·c++·算法
-dzk-32 分钟前
【技巧】LC 31.下一个排列
算法
lcj25111 小时前
【Linux】 Makefile 详解
linux·笔记·面试
(Charon)1 小时前
【C++面试】迭代器失效是什么?vector、list、map中如何避免迭代器失效
c++·算法·面试
常州晟凯电子科技1 小时前
sigmaStar SSC305DE/SSC308开发笔记之开发环境搭建和SDK编译
人工智能·笔记·嵌入式硬件·物联网·性能优化·视频编解码
wdfk_prog2 小时前
LWIP教程 00:从网线上的电信号到 lwIP——PHY、MAC、DMA 与 `netif` 的完整边界
运维·网络·笔记·学习·ip
小黄蚁2 小时前
无人驾驶入门笔记(一)
笔记·自动驾驶·信息与通信