2996. 大于等于顺序前缀和的最小缺失整数
题目描述
给你一个下标从 0 开始的整数数组 nums 。
如果一个前缀 nums[0..i] 满足对于 1 <= j <= i 的所有元素都有 nums[j] = nums[j - 1] + 1 ,那么我们称这个前缀是一个 顺序前缀 。特殊情况是,只包含 nums[0] 的前缀也是一个 顺序前缀 。
请你返回 nums 中没有出现过的 最小 整数 x ,满足 x 大于等于 最长 顺序前缀的和。
示例 1:
输入:nums = [1,2,3,2,5] 输出:6 解释:nums 的最长顺序前缀是 [1,2,3] ,和为 6 ,6 不在数组中,所以 6 是大于等于最长顺序前缀和的最小整数。
示例 2:
输入:nums = [3,4,5,1,12,14,13] 输出:15 解释:nums 的最长顺序前缀是 [3,4,5] ,和为 12 ,12、13 和 14 都在数组中,但 15 不在,所以 15 是大于等于最长顺序前缀和的最小整数。
提示:
1 <= nums.length <= 501 <= nums[i] <= 50
解法
方法一:模拟
思考
最长顺序前缀是从下标 \(0\) 起的连续递增段,其和为 \(s\),再找不在数组中的最小 \(\ge s\) 的整数。\(n \le 50\),先扫描前缀和,再用集合判断 \(s,s+1,\ldots\) 是否出现。
值域很小,线性递增即可碰到缺口。
我们先求出数组 \(nums\) 的最长顺序前缀和 \(s\),然后从 \(s\) 开始枚举整数 \(x\),如果 \(x\) 不在数组 \(nums\) 中,那么 \(x\) 就是答案。
由于题目中 \(nums[i] \leq 50\),我们可以用一个长度为 \(51\) 的数组(或者哈希表)来记录数组中出现过的整数,从而快速判断一个整数是否在数组 \(nums\) 中。
时间复杂度 \(O(n + M)\),空间复杂度 \(O(M)\)。其中 \(n\) 是数组 \(nums\) 的长度,而 \(M\) 是数组元素的上限,本题中 \(M = 51\)。
1 2 3 4 5 6 7 8 9 10 11 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | |