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;
- 前
- 原代码用差分数组间接判断,可简化为直接校验。
算法步骤
- 计算
n = nums.length - 1; - 对数组排序;
- 遍历前
len-1个元素,检查是否等于i+1; - 检查最后一个元素是否等于
n; - 全部满足则返回
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(nlogn)O(n \log n)O(nlogn),排序主导复杂度,遍历为线性级。
- 空间复杂度 :O(1)O(1)O(1),仅使用常数变量,排序为原地操作。
6. 总结
- 核心思路:排序 + 线性校验 ,利用
base[n]的结构特性直接判断; - 优化后逻辑更直接,无需差分数组,可读性和效率更高。