主题切换
LeetCode 每日一题笔记
0. 前言
- 日期:2026.05.14
- 题目:2784. 检查数组是否是好数组
- 难度:简单
- 标签:数组、排序、模拟
1. 题目理解
问题描述: 给定一个整数数组 nums,判断它是否是一个好数组。 一个长度为 n 的数组是好数组,当且仅当:
- 数组中包含
1到n-1的每个整数恰好一次; - 整数
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
- 前 n-1 位:
- 直接排序后校验即可。
算法步骤
- 对数组排序;
- 遍历前 n-1 个位置,必须严格等于
i+1; - 最后一个位置必须等于
n-1; - 全部满足返回 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. 复杂度分析
- 原版代码 时间:
(排序) 空间: (额外数组) - 优化代码 时间:
(排序) 空间: (无额外数组) 优势:逻辑清晰、无多余变量、无分支嵌套、效率更高
6. 总结
- 核心:排序后直接按位置校验,是最直观、最简洁的解法。
- 优化点:去掉多余差分数组,减少判断分支,代码更短更易读。
- 关键:好数组排序后一定是
[1,2,...,n-1,n-1]。