今天的每日一题是一道简单题,数据范围很小,n^3的复杂度也可以通过,但是为了写的稍微好看一点,反而浪费了很多时间。最后分类讨论解决的,分类之后每种情况代码都还算简洁。
3471. 找出最大的几近缺失整数
给你一个整数数组 nums 和一个整数 k 。
如果整数 x 恰好仅出现在 nums 中的一个大小为 k 的子数组中,则认为 x 是 nums 中的几近缺失(almost missing)整数。
返回 nums 中 最大的几近缺失 整数,如果不存在这样的整数,返回 -1 。
子数组 是数组中的一个连续元素序列。
思路
按照以下情况进行分类。
n == k :问题变为求数组最大值,一次遍历解决k == 1 :问题变为求出现次数为1的数字的最大值,一次遍历数组加一次遍历哈希表解决。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;
}
};