LeetCode 3471

2 阅读1分钟

今天的每日一题是一道简单题,数据范围很小,n^3的复杂度也可以通过,但是为了写的稍微好看一点,反而浪费了很多时间。最后分类讨论解决的,分类之后每种情况代码都还算简洁。

3471. 找出最大的几近缺失整数

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

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

返回 nums 中 最大的几近缺失 整数,如果不存在这样的整数,返回 -1 。

子数组 是数组中的一个连续元素序列。

思路

按照以下情况进行分类。

  1. n == k : 问题变为求数组最大值,一次遍历解决
  2. k == 1 : 问题变为求出现次数为1的数字的最大值,一次遍历数组加一次遍历哈希表解决。
  3. 1 < k < n : 只能取nums[0]或者nums[n - 1],但是要验证这俩数字是否是数组内唯一,如果不是不能取。

复杂度

三种情况都只需要遍历数组一次或两次, 复杂度为O(n)

代码

class Solution {
public:
    int largestInteger(vector<int>& nums, int k) {
        int n = nums.size();
        if(n == k)
        {
            int ans = 0;
            for(int x : nums)
                ans = max(ans, x);
            return ans;
        }
        else if(k == 1)
        {
            int a[51] = {0};
            for(int x : nums)
                a[x] ++;
            for(int i = 50; i >= 0;  i--)
                if(a[i] == 1)
                    return i;
            return -1;
        }
        int ans = -1;
        bool can = true;
        for(int i = 1; i < n; i ++)
        {
            if(nums[0] == nums[i])
                can = false;
        }
        if(can)
            ans = max(ans, nums[0]);
        can = true;
        for(int i = 0;  i < n - 1; i ++)
            if(nums[i] == nums[n - 1])
                can = false;
        if(can)
            ans = max(ans, nums[n - 1]);
        return ans;
    }
};