comments | difficulty | edit_url | rating | source | tags | |||
---|---|---|---|---|---|---|---|---|
true |
简单 |
1405 |
第 121 场双周赛 Q1 |
|
给你一个下标从 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 <= 50
1 <= nums[i] <= 50
我们先求出数组
时间复杂度
class Solution:
def missingInteger(self, nums: List[int]) -> int:
s, j = nums[0], 1
while j < len(nums) and nums[j] == nums[j - 1] + 1:
s += nums[j]
j += 1
vis = set(nums)
for x in count(s):
if x not in vis:
return x
class Solution {
public int missingInteger(int[] nums) {
int s = nums[0];
for (int j = 1; j < nums.length && nums[j] == nums[j - 1] + 1; ++j) {
s += nums[j];
}
boolean[] vis = new boolean[51];
for (int x : nums) {
vis[x] = true;
}
for (int x = s;; ++x) {
if (x >= vis.length || !vis[x]) {
return x;
}
}
}
}
class Solution {
public:
int missingInteger(vector<int>& nums) {
int s = nums[0];
for (int j = 1; j < nums.size() && nums[j] == nums[j - 1] + 1; ++j) {
s += nums[j];
}
bitset<51> vis;
for (int x : nums) {
vis[x] = 1;
}
for (int x = s;; ++x) {
if (x >= 51 || !vis[x]) {
return x;
}
}
}
};
func missingInteger(nums []int) int {
s := nums[0]
for j := 1; j < len(nums) && nums[j] == nums[j-1]+1; j++ {
s += nums[j]
}
vis := [51]bool{}
for _, x := range nums {
vis[x] = true
}
for x := s; ; x++ {
if x >= len(vis) || !vis[x] {
return x
}
}
}
function missingInteger(nums: number[]): number {
let s = nums[0];
for (let j = 1; j < nums.length && nums[j] === nums[j - 1] + 1; ++j) {
s += nums[j];
}
const vis: Set<number> = new Set(nums);
for (let x = s; ; ++x) {
if (!vis.has(x)) {
return x;
}
}
}