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; }