第82场双周赛

黑暗后是黎明!

6116. 计算布尔二叉树的值

思路:

递归,就是对二叉树的递归遍历,判断非叶子节点是2还是3来进行与/并叶子的计算。

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:bool evaluateTree(TreeNode* root) {//题目明确说了树中节点数目在 [1, 1000] 之间。所以不可能为空//完整二叉树,无左孩子一定无有孩子,考虑一边就行if(!root->left)return root->val;auto l =evaluateTree(root->left);auto r=evaluateTree(root->right);if(root->val==2) return l||r;return l&&r;}
};

6117. 坐上公交的最晚时间

思路:

来源灵佬https://www.bilibili.com/video/BV1Le4y1R7xu/?spm_id_from=333.788&vd_source=11a40407ca73e76119d9f9b789cc7ff2、

排序后,模拟乘客上车的过程。

模拟结束后:

如果最后一班公交还有空位,我们可以在发车时到达公交站,如果此刻有人,我们可以顺着他往前找到没人到达的时刻;
如果最后一班公交没有空位,我们可以找到上一个上车的乘客,顺着他往前找到一个没人到达的时刻。

作者:endlesscheng
链接:https://leetcode.cn/problems/the-latest-time-to-catch-a-bus/solution/pai-xu-by-endlesscheng-h9w9/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

class Solution {
public:int latestTimeCatchTheBus(vector<int>& buses, vector<int>& passengers, int capacity) {sort(buses.begin(), buses.end());sort(passengers.begin(), passengers.end());//j代表上车的人数,c代表当前的容量剩余int j=0,c;for(int t:buses){//此时容量有剩余且当前的人数未到达全部乘客的人数,乘客来的比公交早for(c=capacity;c&&j<passengers.size()&&passengers[j]<= t;j++){c--;}}j--;//代表最后一个上车的乘客//顺着最后一个人往前找,找到即答案int ans = c ? buses.back() : passengers[j];while (j >= 0 && passengers[j--] == ans) --ans; // 往前找没人到达的时刻return ans;}
};

6118. 最小差值平方和

贪心 + 二分查找

参考:

https://leetcode.cn/problems/minimum-sum-of-squared-difference/solution/c-by-lao-hang-n-a2sg/

class Solution {bool check(vector<int> diff, int mid, int cnt){long long sum = 0;      // sum注意要为long long,不然int类型存不下100000*100000for(int i: diff) {sum += (max(i, mid) - mid);}return sum<=cnt; // 操作数小于k1+k2说明大值都可以缩小到mid}
public:long long minSumSquareDiff(vector<int>& nums1, vector<int>& nums2, int k1, int k2) {int n = nums1.size();long long  sum=0;vector<int> diff(n);for(int i=0;i<n;i++){diff[i]=abs(nums1[i]-nums2[i]);sum+= diff[i];}if(sum<=k1+k2) return 0;//二分求目标值int target, left = 0, right = 100001;   while(left<=right){int mid = left +(right-left)/2;if(check(diff,mid,k1+k2)){target = mid;right=mid-1;}else{left = mid+1;}}//int res=k1+k2;// 将所有大于target的值变为targetfor(int i = 0; i < n; ++i) {if(diff[i]>target){res-=(diff[i]-target); // 减去将该值变为target所需的操作数diff[i]=target; // 更新该值为target}}// 如果剩余操作数大于0,说明还可以继续操作差值数组// 继续对大值们进行修改,此时数组中的大值均为target,那么就为target的项就减去1,操作数也减1
for(int i=0;i<n &&res>0;++i){if(diff[i]==target){--diff[i];--res;}
}long long ans=0;
for(int i:diff){ans+=1ll*i*i;
}
return ans;}
};

6119 元素值大于变化阈值的子数组

思路:

本题我的思路是,每次给一个子数组的长度,然后再遍历该长度下的子数组中所有元素是否能够全部符合题目条件,如果符合就把当前长度加入到一个set当中,最后遍历set的值即可。(好像不对,题目只要求有一个符合的即可)

别人的思路:

目前弄懂了单调栈的解法,还有并查集的方法目前还没有弄懂

 /*单调栈的应用:不妨枚举nums[i]并假设某包含nums[i]的子段是长度为k的某段中最小的数字在该段中其余数字都大于nums[i],只要nums[i]>threshold/k,那么段内的所有元素均大于threshold/k我们只需要求出有没有这样的nums[i]就可以知道是否有符合题意的k怎样维护某个nums[i]在某个段内是最小的数字?我们只需要找到nums[i]左边和右边首个严格小于nums[i]的索引那么索引之间就是nums[i]这段的波及范围快速求nums[i]左边和右边首个小于nums[i]的元素属于Next Greater问题,可以用单调栈解决时间复杂度:O(N) 空间复杂度:O(N)*/
class Solution {
public:int validSubarraySize(vector<int>& nums, int threshold) {int n=nums.size();stack<int> s;int left[n];// left[i] 为左侧小于 nums[i] 的最近元素位置(不存在时为 -1)for(int i=0;i<n;i++){// 遇到nums[i]<=nums[栈顶索引] -> 弹出栈顶索引直至nums[i]>nums[栈顶索引]// 此时nums[栈顶索引]就是nums[i]左边首个严格小于nums[i]的数字// 被弹出的那些栈顶元素是不可能成为后面left[i]有效取值的,因为会优先取到当前的nums[i]// e.g. nums[st1]=[1,2,4,5] nums[i]=3 显然4与5不符合题意弹出 3才是符合题意的 加入后面有个6进来了// 必然会优先取到3而不会取更前面的4与5while(!s.empty() &&nums[s.top()] >=nums[i]){s.pop();}left[i]=s.empty() ?-1:s.top();  // 栈顶的必定1严格小于nums[i]并且是最近的(-1表示取全部)s.push(i);}int right[n];s = stack<int>();for(int i=n-1;i>=0;i--){while(!s.empty() &&nums[s.top()] >=nums[i]){s.pop();}right[i]=s.empty() ?n:s.top();s.push(i);}
// 枚举nums[i]根据其波及范围确定到k,再判断k是否合法for(int i=0;i<n;i++){int k = right[i]-left[i]-1;// cout<<k;if(nums[i]>threshold/k)return k;}return -1;}
};

总结:
本次LeetCode周赛看了评论,普遍说难度大。对我来说也是,哈哈。很自闭,赛后看解析都很费力。
本次的题目的类型分别为 1.二叉树的应用(还行)2.脑筋急转弯 3.贪心+二分 4.并查集/单调栈
本次需要补的内容有:单调栈的内容,并查集的的内容以及类型的题目。重新回顾一下 3/4两题的解题方法。
在下周的时候重点学习一下相关欠缺的内容,绝不忙不刷题。

LeetCode第82场双周赛相关推荐

  1. LeetCode第45场双周赛-解题报告

    LeetCode第45场双周赛-解题报告 A. 唯一元素的和 原题链接 https://leetcode-cn.com/problems/sum-of-unique-elements/ 解题思路 因为 ...

  2. Leetcode 第 69 场双周赛记录

    Leetcode 第 69 场双周赛记录 1.第一题 5960. 将标题首字母大写 难度:easy 给你一个字符串 title ,它由单个空格连接一个或多个单词组成,每个单词都只包含英文字母.请你按以 ...

  3. LeetCode 第 30 场双周赛(477/2545,前18.7%,第2次全部通过)

    文章目录 1. 比赛结果 2. 题目 1. LeetCode 5177. 转变日期格式 easy 2. LeetCode 5445. 子数组和排序后的区间和 medium 3. LeetCode 54 ...

  4. LeetCode 第 31 场双周赛(273/2767,前9.87%,第3次全部通过)

    文章目录 1. 比赛结果 2. 题目 1. LeetCode 5456. 在区间范围内统计奇数数目 easy 2. LeetCode 5457. 和为奇数的子数组数目 medium 3. LeetCo ...

  5. LeetCode 第 36 场双周赛(304/2204,前13.8%)

    文章目录 1. 比赛结果 2. 题目 1. LeetCode 5515. 设计停车系统 easy 2. LeetCode 5516. 警告一小时内使用相同员工卡大于等于三次的人 medium 3. L ...

  6. LeetCode 第 35 场双周赛(216/2839,前7.61%)

    文章目录 1. 比赛结果 2. 题目 1. LeetCode 5503. 所有奇数长度子数组的和 easy 2. LeetCode 5505. 所有排列中的最大和 medium 3. LeetCode ...

  7. LeetCode 第 34 场双周赛(385/2842,前13.5%)

    文章目录 1. 比赛结果 2. 题目 1. LeetCode 5491. 矩阵对角线元素的和 easy 2. LeetCode 5492. 分割字符串的方案数 medium 3. LeetCode 5 ...

  8. LeetCode 第 33 场双周赛(511/3304,前15.5%,第4次全部通过)

    文章目录 1. 比赛结果 2. 题目 1. LeetCode 5479. 千位分隔数 easy 2. LeetCode 5480. 可以到达所有点的最少点数目 medium 3. LeetCode 5 ...

  9. LeetCode 第 32 场双周赛(983/2957,前33.2%)

    文章目录 1. 比赛结果 2. 题目 1. LeetCode 5468. 第 k 个缺失的正整数 easy 2. LeetCode 5469. K 次操作转变字符串 medium 3. LeetCod ...

  10. LeetCode 第 29 场双周赛(890/2259,前39.4%)

    文章目录 1. 比赛结果 2. 题目 1. LeetCode 5432. 去掉最低工资和最高工资后的工资平均值 easy 2. LeetCode 5433. n 的第 k 个因子 medium 3. ...

最新文章

  1. java 手势识别_java – 如何在Android中实现手势识别
  2. php 计算月,PHP自然月的算法
  3. jsp用tags传递参数
  4. Linux下的图形库curses写贪吃蛇,酷
  5. 你可能也会掉进这个简单的 String 的坑
  6. pagefile.sys and heberfil.sys
  7. 获得代理ippython_Python搭建代理IP池实现获取IP的方法
  8. 优秀的 jQuery 文本输入框自动完成 自动提示插件
  9. Web后端学习笔记 Flask(9)cookie and session
  10. LeetCode(860)——柠檬水找零(JavaScript)
  11. Ghost本地安装highlight.js使代码高亮
  12. Linux uname命令
  13. F5入口IP依据不同的端口实现转发到不同的POOL
  14. linux socket 开源库,linux c websocket开源库libwebsockets的编译和使用-Go语言中文社区...
  15. (测试可用)针式打印机打印WEB页面字体不清晰,解决方法
  16. 怎么把cad转化为jpg图片
  17. Python微信公众号后台开发教程001
  18. Codeforces633H-Fibonacci-ish II
  19. 51nod-1429 巧克力
  20. Mac 更新port卡住怎么办?

热门文章

  1. centos7上安装Crucible教程及出现问题的解决
  2. android 倒水动画,Android 模拟圆形水杯倒水的效果
  3. mysql语法 join on 表示什么
  4. matlab 绘制有向图、无向图、有权有向图、有权无向图以及查找最短路径
  5. 统计大写字母出现的次数
  6. 心形函数的正确打开方式(Unity3D Shader)
  7. TestFlight iOS 平台 App内测 工具使用
  8. L1-009 N个数求和 (20 分)(C语言)(测试点3和测试点5)
  9. 潘多拉路由器搭建php,MT7620A 无线路由 极路由 1S 定制版 OPERWRT 潘多拉 中继 营销...
  10. 私有云服务器和公有云服务器的区别你真的知道吗?