Skip to content

LeetCode 每日一题笔记

0. 前言

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

1. 题目理解

问题描述: 给定一个整数数组 nums,判断它是否是一个好数组。 一个长度为 n 的数组是好数组,当且仅当:

  1. 数组中包含 1n-1 的每个整数恰好一次
  2. 整数 n-1 恰好出现两次

示例

输入:nums = [2, 1, 3] 输出:false 解释:n=3,需要 [1,2,2]

输入:nums = [1, 2, 2] 输出:true

2. 解题思路

核心观察

  • 排序后,合法数组一定满足:
    • 前 n-1 位:1, 2, 3, ..., n-1
    • 最后一位:n-1
  • 直接排序后校验即可。

算法步骤

  1. 对数组排序;
  2. 遍历前 n-1 个位置,必须严格等于 i+1
  3. 最后一个位置必须等于 n-1
  4. 全部满足返回 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
class Solution {
public boolean isGood(int[] nums) {
    int n = nums.length;
    Arrays.sort(nums);
    // 前n-1个元素必须是1,2,3,...,n-1
    for (int i = 0; i < n - 1; i++) {
        if (nums[i] != i + 1) {
            return false;
        }
    }
    // 最后一个元素必须等于n-1
    return nums[n - 1] == n - 1;
}
}

5. 复杂度分析

  • 原版代码 时间:O(nlogn)(排序) 空间:O(n)(额外数组)
  • 优化代码 时间:O(nlogn)(排序) 空间:O(1)(无额外数组) 优势:逻辑清晰、无多余变量、无分支嵌套、效率更高

6. 总结

  • 核心:排序后直接按位置校验,是最直观、最简洁的解法。
  • 优化点:去掉多余差分数组,减少判断分支,代码更短更易读。
  • 关键:好数组排序后一定是 [1,2,...,n-1,n-1]

Powered by VitePress 1.6.4 | 持续更新中