【教3妹学编程-算法题】大于等于顺序前缀和的最小缺失整数

【教3妹学编程-算法题】大于等于顺序前缀和的最小缺失整数_第1张图片

2哥 : 叮铃铃,3妹,过年干嘛呢,是不是逛吃逛吃,有没有长胖呢。
3妹:切,我妈张罗着要给我相亲呢。
2哥 : 相亲?哈哈哈哈
3妹:别笑了,我妈说跟我年龄相等的人都已经孩子上小学了,跟她年龄相等的人孙子最少都会打酱油了。
2哥 :哈哈哈哈,让我先笑一会儿
3妹:话说2哥过年在家里也刷题吗?
2哥:当然了,雷打不动。
3妹:好吧,还得是2哥,我有几天懈怠了。
2哥:好吧,说到刷题啊,今天有一道“最小”的题目, 让我们先做一下吧~

【教3妹学编程-算法题】大于等于顺序前缀和的最小缺失整数_第2张图片

题目:

给你一个下标从 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

思路:

【教3妹学编程-算法题】大于等于顺序前缀和的最小缺失整数_第3张图片

  • 设 nums 的异或和为 s。

  • 求出最长前缀,同时维护最长前缀的元素和 sum。

  • 不断增加 sum,直到 sum不在 nums 中。
    返回 sum。

java代码:

class Solution {
    public int missingInteger(int[] nums) {
        int sum = nums[0];
        for (int i = 1; i < nums.length && nums[i] == nums[i - 1] + 1; i++) {
            sum += nums[i];
        }

        Set set = new HashSet<>();
        for (int num : nums) {
            set.add(num);
        }
        while (set.contains(sum)) { // 至多循环 n 次,例如 1324567
            sum++;
        }
        return sum;
    }
}

你可能感兴趣的:(算法)