LeetCode 3471.找出最大的几近缺失整数:三种情况判断

【LetMeFly】3471.找出最大的几近缺失整数:三种情况判断

力扣题目链接:https://leetcode.cn/problems/find-the-largest-almost-missing-integer/

给你一个整数数组 nums 和一个整数 k

如果整数 x 恰好仅出现在 nums 中的一个大小为 k 的子数组中,则认为 xnums 中的几近缺失(almost missing)整数。

返回 nums最大的几近缺失 整数,如果不存在这样的整数,返回 -1
子数组 是数组中的一个连续元素序列。

示例 1:
**输入:**nums = 3,9,2,1,7, k = 3

**输出:**7

解释:

  • 1 出现在两个大小为 3 的子数组中:[9, 2, 1][2, 1, 7]
  • 2 出现在三个大小为 3 的子数组中:[3, 9, 2][9, 2, 1][2, 1, 7]
  • 3 出现在一个大小为 3 的子数组中:[3, 9, 2]
  • 7 出现在一个大小为 3 的子数组中:[2, 1, 7]
  • 9 出现在两个大小为 3 的子数组中:[3, 9, 2][9, 2, 1]

返回 7 ,因为它满足题意的所有整数中最大的那个。

示例 2:
**输入:**nums = 3,9,7,2,1,7, k = 4

**输出:**3

解释:

  • 1 出现在两个大小为 4 的子数组中:[9, 7, 2, 1][7, 2, 1, 7]
  • 2 出现在三个大小为 4 的子数组中:[3, 9, 7, 2][9, 7, 2, 1][7, 2, 1, 7]
  • 3 出现在一个大小为 4 的子数组中:[3, 9, 7, 2]
  • 7 出现在三个大小为 4 的子数组中:[3, 9, 7, 2][9, 7, 2, 1][7, 2, 1, 7]
  • 9 出现在两个大小为 4 的子数组中:[3, 9, 7, 2][9, 7, 2, 1]

返回 3 ,因为它满足题意的所有整数中最大的那个。

示例 3:
**输入:**nums = 0,0, k = 1

输出:-1

解释:

不存在满足题意的整数。

提示:

  • 1 <= nums.length <= 50
  • 0 <= nums[i] <= 50
  • 1 <= k <= nums.length

解题方法:三种情况分类讨论

  • 如果 n = k n=k n=k,则真个数组只有一个子数组,返回数组最大值
  • 如果 k = 1 k=1 k=1,则每个元素都是一个子数组,返回数组中出现次数为1的最大值
  • 否则 1 < k < n 1\lt k\lt n 1<k<n,则除了第一个数和最后一个数外,每个数都至少被包含到两个子数组中,必定不可能是最大的几近缺失整数。所以我们只需看首尾两数中有没有只出现一次的数,若有则返回大的那个

时空复杂度:

  • 时间复杂度 O ( n 2 ) O(n^2) O(n2),其中 n = l e n ( n u m s ) n=len(nums) n=len(nums)
  • 空间复杂度 O ( log ⁡ n ) O(\log n) O(logn),最大数据量是 50 50 50不使用哈希表也很快

AC代码

C++
cpp 复制代码
/*
 * @LastEditTime: 2026-08-18 16:46:31
 */
class Solution {
public:
    int largestInteger(vector<int>& nums, int k) {
        int n = nums.size();
        if (n == k) {
            return *max_element(nums.begin(), nums.end());
        }

        if (k == 1) {
            ranges::sort(nums);
            for (int i = n - 1; i >= 0; i--) {
                if (i - 1 >= 0 && nums[i - 1] == nums[i]) {
                    continue;
                }
                if (i + 1 < n && nums[i + 1] == nums[i]) {
                    continue;
                }
                return nums[i];
            }
            return -1;
        }
        
        int first = nums[0], last = nums.back();
        if (first == last) {
            return -1;
        }
        bool another1 = false, another2 = false;
        for (int i = 1; i < n - 1; i++) {
            if (nums[i] == first) {
                another1 = true;
            }
            if (nums[i] == last) {
                another2 = true;
            }
        }
        if (another1 && another2) {
            return -1;
        }
        if (!another1 && !another2) {
            return max(first, last);
        }
        return another1 ? last : first;
    }
};
  • 执行用时分布 0 ms 击败 100.00%
  • 消耗内存分布 28.13 MB 击败 92.86%

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

相关推荐
2401_862880821 小时前
数据结构 --- 栈
c语言·数据结构·算法
致Great1 小时前
Qwen3.8-27B 接入 DSH 全流程实测:写代码、跑长任务,都没问题
算法
linux-hzh3 小时前
百日算法修炼 · Day 12
算法·深度优先
额额额对了3 小时前
数据结构:二叉树
c语言·数据结构·算法
iNeuOS工业互联网3 小时前
iNeuOS_Vision_视觉分析,增加SAM3模型对实例分割和目标检测AI自动标注图片样本功能
人工智能·算法·目标检测
qeen873 小时前
【数据结构】红黑树的算法原理解析与实现
开发语言·数据结构·c++·算法·红黑树
码匠许师傅4 小时前
【C++ 面试真题】20. 聊聊 C++ 的标准库常用算法
c++·算法·面试
aqiu1111114 小时前
【算法刷题】蓝桥杯:0星际争霸(大数比较 + 多关键字自定义排序)
算法·排序·自定义排序
m0_547486664 小时前
《数据结构与算法(Python语言版)》全套PPT课件2026
数据结构·算法