Leetcode
- Leetcode -643.子数组最大平均值Ⅰ
- Leetcode -645.错误的集合
Leetcode -643.子数组最大平均值Ⅰ
题目:给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。
请你找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数。
任何误差小于 10^- 5 的答案都将被视为正确答案。
示例 1:
输入:nums = [1, 12, -5, -6, 50, 3], k = 4
输出:12.75
解释:最大平均数(12 - 5 - 6 + 50) / 4 = 51 / 4 = 12.75
示例 2:
输入:nums = [5], k = 1
输出:5.00000
思路是使用滑动窗口,依次取这 k 项中的和的较大值,如下图所示:
代码如下:
double findMaxAverage(int* nums, int numsSize, int k)
{
double sum = 0, ans = 0;
//先将前 k 项和加起来
for (int i = 0; i < k; i++)
{
sum += nums[i];
}
//前 k 项和赋给最大且长度为 k 的连续子数组元素的和
double maxsum = sum;
//将前 k 项和减去这 k 项和中的第一项,再加上当前项,就实现了滑动窗口
//再比较当前 sum 与 maxsum 的较大值,maxsum取较大值
for (int i = k; i < numsSize; i++)
{
sum = sum - nums[i - k] + nums[i];
maxsum = fmax(sum, maxsum);
}
//最后返回平均数
return maxsum / k;
}
Leetcode -645.错误的集合
题目:集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合丢失了一个数字并且有一个数字重复 。
给定一个数组 nums 代表了集合 S 发生错误后的结果。
请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。
示例 1:
输入:nums = [1, 2, 2, 4]
输出:[2, 3]
示例 2:
输入:nums = [1, 1]
输出:[1, 2]
思路是生成1 - n个整数,记录每个数出现的次数,如果某个数出现两次,即是重复的数;如果某个数没有出现过,即是丢失的整数;
int* findErrorNums(int* nums, int numsSize, int* returnSize)
{
//定义一个hash数组,并初始化为0
int hash[10001] = { 0 };
//记录每个数字出现的次数
for (int i = 0; i < numsSize; i++)
{
hash[nums[i]]++;
}
//开辟返回数组,数组长度为2
int* ret = (int*)malloc(sizeof(int) * 2);
*returnSize = 2;
//如果hash[i] == 2,说明这一个数出现两次,即是我们要找的重复的数
//如果hash[i] == 0,说明这一个数没出现过,即是我们要找的丢失的数
for (int i = 1; i <= numsSize; i++)
{
if (hash[i] == 2)
ret[0] = i;
if (hash[i] == 0)
ret[1] = i;
}
//返回数组
return ret;
}