第一题



用一个新数组newSalary保存去掉最低和最高工资的工资列表,然后遍历newSalary,计算总和,除以元素个数,就得到了平均值。

class Solution {
public:
double average(vector<int>& salary) {
sort(salary.begin(), salary.end());
vector<int> newSalary;
for(int i = 1; i < salary.size() - 1; ++i) {
newSalary.push_back(salary[i]);
}
double res = 0;
for(int i = 0; i < newSalary.size(); ++i) {
res += newSalary[i];
}
res /= newSalary.size();
return res;
}
};

第二题



直接从小到达枚举所有的因子,最后返回第k个因子即可。

class Solution {
public:
int kthFactor(int n, int k) {
vector<int> factor;
factor.push_back(1); //1是所有数的因子
for(int i = 2; i < n; ++i) {
if(n % i == 0) {
factor.push_back(i);
}
}
factor.push_back(n); //这个数本身也是自己的因子
int size = factor.size();
if(size < k) {
return -1;
} else {
return factor[k - 1];
}
}
};

第三题



用一个zeroPos数组存放原数组所有的0的位置。然后枚举所有删除0的情况,每个情况都用一个新数组newArray存储删除掉0之后剩下的元素。

然后遍历新数组newArray,计算连续的1的长度。 这样,当枚举完所有删除位置,以及对应的连续1的最大长度之后,就能得到答案。

class Solution {
public:
int longestSubarray(vector<int>& nums) {
vector<int> zeroPos; //存储nums中0的位置
for(int i = 0; i < nums.size(); ++i) {
if(nums[i] == 0) {
zeroPos.push_back(i);
}
}
if(zeroPos.size() == 0) { //如果原数组没有0,即全1
return nums.size() - 1; //那么删除一个元素之后,连续1的最大长度为nums.size() - 1
}
int res = 0;
for(int i = 0; i < zeroPos.size(); ++i) { //枚举所有删除位置
vector<int> newArray; //存储删除一个0之后剩下的元素组成的数组
int delPos = zeroPos[i]; //删除位置
for(int j = 0; j < nums.size(); ++j) {
if(j == delPos) { //如果是删除位置,就不加入新数组
continue;
} else {
newArray.push_back(nums[j]);
}
} for(int j = 0; j < newArray.size(); ) { //遍历新数组,计算连续1的最大长度
if(newArray[j] == 0) {
++j;
} else {
int L = j, R = j + 1; //双指针计算连续1的最大长度
while(R < newArray.size() && newArray[R] == 1) {
++R;
}
res = max(res, R - L); //当前连续1的长度为R - L,更新一下res
j = R; //下一次 j 从 R的位置开始枚举即可
}
}
}
return res;
}
};

这题还有一个双指针做法。 用两个变量start和end指向子数组的开始和结束下标,两个指针只会向右移动,我们需要寻找这样一个子数组nums[start ~ end],满足start ~ end之间0的个数不超过1个(1个或0个),这样我们删去一个元素(0或1)剩下的子数组就满足连续1的条件,然后我们更新长度。由于此时子数组的长度为end - start + 1,又因为题目要求必须删掉一个元素(就算子数组全部是1,也得删掉一个1),所以我们得到res = max(res, end - start); end - start是子数组长度减1得来的。

class Solution {
public:
int longestSubarray(vector<int>& nums) {
int res = 0;
for(int start = 0, end = 0, zeroNum = 0; end < nums.size(); ++end) { //zeroNum表示当前子数组中0的个数
if(nums[end] == 0) { //如果尾指针指向的元素为0,增加zeroNum
++zeroNum;
}
while(zeroNum > 1) { //如果子数组中0的个数大于1,我们需要增加头指针
zeroNum -= !nums[start++]; //这句话的意思是,如果start指向的元素为0,则增加start,同时子数组中0的数量减一;否则增加start,子数组中0的数量保持不变。 只有子数组中0的数量减到1以下时才跳出循环,暂时不用增加start
}
res = max(res, end - start); //此时子数组的大小为end - start + 1, 由于要减去一个要删除的元素,所以更新的长度为end - start
}
return res;
}
};

使用双指针做法,左右指针只会在一层循环内向右移动,因此时间复杂度为O(n);由于无需额外的辅助数组,因此空间复杂度为O(1).

第四题



状态压缩DP,留个坑明天填上。

LeetCode第29场双周赛题解的更多相关文章

  1. LeetCode第8场双周赛(Java)

    这次我只做对一题. 原因是题目返回值类型有误,写的是 String[] ,实际上应该返回 List<String> . 好吧,只能自认倒霉.就当涨涨经验. 5068. 前后拼接 解题思路 ...

  2. LeetCode 第 15 场双周赛

    1287.有序数组中出现次数超过25%的元素 1288.删除被覆盖区间 1286.字母组合迭代器 1289.下降路径最小和 II 下降和不能只保留原数组中最小的两个,hacked. 1287.有序数组 ...

  3. LeetCode 第 14 场双周赛

    基础的 api 还是不够熟悉啊 5112. 十六进制魔术数字 class Solution { public: char *lltoa(long long num, char *str, int ra ...

  4. Java实现 LeetCode第30场双周赛 (题号5177,5445,5446,5447)

    这套题不算难,但是因为是昨天晚上太晚了,好久没有大晚上写过代码了,有点不适应,今天上午一看还是挺简单的 5177. 转变日期格式   给你一个字符串 date ,它的格式为 Day Month Yea ...

  5. leetcode-第11场双周赛-5089-安排会议日程

    题目描述: 自己的提交: class Solution: def minAvailableDuration(self, slots1: List[List[int]], slots2: List[Li ...

  6. leetcode-第11场双周赛-5088-等差数列中缺失的数字

    题目描述: 自己的提交: class Solution: def missingNumber(self, arr: List[int]) -> int: if len(arr) == 2: re ...

  7. leetcode-第五场双周赛-1134-阿姆斯特朗数

    第一次提交: class Solution: def isArmstrong(self, N: int) -> bool: n = N l = len(str(N)) res = 0 while ...

  8. leetcode-第五场双周赛-1133-最大唯一数

    第一次提交: class Solution: def largestUniqueNumber(self, A: List[int]) -> int: dict = {} for i in A: ...

  9. LeetCode 第 165 场周赛

    LeetCode 第 165 场周赛 5275. 找出井字棋的获胜者 5276. 不浪费原料的汉堡制作方案 5277. 统计全为 1 的正方形子矩阵 5278. 分割回文串 III C 暴力做的,只能 ...

随机推荐

  1. Java实现 LeetCode 495 提莫攻击

    495. 提莫攻击 在<英雄联盟>的世界中,有一个叫 "提莫" 的英雄,他的攻击可以让敌方英雄艾希(编者注:寒冰射手)进入中毒状态.现在,给出提莫对艾希的攻击时间序列和 ...

  2. SQL Server账号密码(sa)登录失败 错误原因:18456

    (其实以前经常用的时候,都很简单,最近一段时间不用了,再一看发现都忘记的差不多了,还是写一篇博客吧,防止下一次再在这种问题上面浪费时间) 使用window登录 打开属性 打开安全性 选择SQL ser ...

  3. PAT 数字黑洞

    给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字.一直重复这样做,我们很快会停在有“数字黑洞 ...

  4. Spring基本介绍

    一:Spring是什么 Spring是分层的 Java SE/EE应用 full-stack 轻量级开源框架,它以IOC控制反转和AOP面向切面编程为核心,提供了展现层 Spring MVC 和持久层 ...

  5. 【asp.net core 系列】5 布局页和静态资源

    0. 前言 在之前的4篇的内容里,我们较为详细的介绍了路由以及控制器还有视图之间的关系.也就是说,系统如何从用户的HTTP请求解析到控制器里,然后在控制器里处理数据,并返回给视图,在视图中显示出来.这 ...

  6. 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(一)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

  7. Python--循环--for && while

    for循环示例:猜数字游戏 winning_number = 38 for i in range(3): guess_num = int(input("guess num:") ) ...

  8. 04.Java基础语法

    一.Java源程序结构与编程规范 一个完整的Java源程序应该包含下列部分 package语句,至多一句,必须放在源程序第一句 import语句,没有或者若干句,必须放在所有类定义前 public c ...

  9. python基础:如何使用 pip 安装第三方库

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 在这个生活中处处都是大数据和人工智能的时代,总是能在各种角落看到 Pyth ...

  10. TensorFlow从0到1之TensorFlow实现反向传播算法(21)

    反向传播(BPN)算法是神经网络中研究最多.使用最多的算法之一,它用于将输出层中的误差传播到隐藏层的神经元,然后用于更新权重. 学习 BPN 算法可以分成以下两个过程: 正向传播:输入被馈送到网络,信 ...