当前位置: 首页 > news >正文

intitle 郑州网站建设wordpress layer 主题

intitle 郑州网站建设,wordpress layer 主题,h5网站建设功能计划表,怎么弄一个自己的网址题目列表 3184. 构成整天的下标对数目 I 3185. 构成整天的下标对数目 II 3186. 施咒的最大总伤害 3187. 数组中的峰值 一、构成整天的下标对数目 I & II 可以直接二重for循环暴力遍历出所有的下标对,然后统计符合条件的下标对数目返回。代码如下 class So…

题目列表

3184. 构成整天的下标对数目 I

3185. 构成整天的下标对数目 II

3186. 施咒的最大总伤害

3187. 数组中的峰值

一、构成整天的下标对数目 I & II

可以直接二重for循环暴力遍历出所有的下标对,然后统计符合条件的下标对数目返回。代码如下

class Solution {
public:int countCompleteDayPairs(vector<int>& hours) {int n = hours.size(), ans = 0;for(int i = 0; i < n; i++) {for(int j = 0; j < i; j++){if((hours[i]+hours[j])%24==0)ans++;}}return ans;}
};

能不能优化呢?或者说能否去掉一层循环,用一次遍历计算出答案?

我们来思考一下内层循环的作用是什么,就是看前面的数字能否和当前数字能否组成能被24整除的数,也就是说只要我们在遍历的同时,统计满足加起来能被24的整除的数的出现次数,就能在O(1)的时间内得到与当前数字匹配的数字个数,从而降低时间复杂度。

如何得知两个数加起来能被24整除?只要知道它们的%24的值即可,比如一个数%24=20,那么我们只要找%24=4的数字即可,故代码如下

class Solution {
public:int countCompleteDayPairs(vector<int>& hours) {int cnt[24]{};int ans = 0;for(auto x:hours) {ans += cnt[(24-x%24)%24]; // (24-x%24)%24 用来计算另一个数%24的余数,为了防止出现24-0 = 24 的情况,故需要(...)%24cnt[x%24]++;}return ans;}
};

二、施咒的最大总伤害

先将数组排序,这样我们从前往后选咒语只要考虑当前咒语伤害是否大于前一个选择的咒语+2即可,当然咒语伤害相同可以同时被选中,所以我们还可以统计伤害相同的咒语的出现次数,然后将数组去重。最终,我们只要考虑当前咒语伤害是否大于前一个选择的咒语+2即可。

状态定义:f[i]表示前i个咒语中能得到的最大伤害

状态转移方程:

  • 选当前咒语,f[i] = f[j] + cnt[x]*x,x = power[i],f[j]为满足power[j] + 2 < power[i]的最接近当前位置的值
  • 不选当前咒语,f[i] = f[i-1]

故 f[i] = max( f[i-1],f[j] + cnt[x]*x),在遍历 j 的时候,我们不用每次都从头开始,j 只会变大,有点类似滑动窗口

代码如下

class Solution {using LL = long long;
public:long long maximumTotalDamage(vector<int>& power) {// 统计相同的咒语的出现次数unordered_map<int,int> mp;for(auto x:power) mp[x]++;// 排序 + 去重sort(power.begin(),power.end());power.erase(unique(power.begin(),power.end()),power.end());int n = power.size();LL ans = 0, j = 0;// f[i] 表示前i个咒语中的施咒最大总伤害// f[i] = max(f[i-1],f[j] + mp[x]*x)  x = power[i]vector<LL> f(n+1); for(int i = 0; i < n; i++) {while(power[j] + 2 < power[i])j++;f[i+1] = max(f[i], f[j] + (LL)mp[power[i]]*power[i]);ans = max(f[i+1], ans);}return ans;}
};

三、数组中的峰值

这题一看题目要求,单点修改 + 区间查询,可以用树状数组,也可以用线段树,代码如下

// 树状数组
struct BIT
{vector<int> t;BIT(int n):t(n+1){}void update(int i, int val){while(i < t.size()) {t[i] += val;i += (i&-i);}}int pre_sum(int i) {int res = 0;while(i > 0) {res += t[i];i -= (i&-i);}return res;}int query(int l, int r){if(l > r) return 0;return pre_sum(r) - pre_sum(l);}
};
class Solution {
public:vector<int> countOfPeaks(vector<int>& nums, vector<vector<int>>& q) {int n = nums.size();BIT t(n);auto update = [&](int i, int val) {if(nums[i] > nums[i-1] && nums[i] > nums[i+1])t.update(i+1,val);};for(int i = 1; i < n-1; i++) {update(i,1);}vector<int> ans;for(auto v:q) {if(v[0]==1) { // 区间查询ans.push_back(t.query(v[1]+1,v[2])); // 注意查询的区间,由于查询的子数组的左右端点不能算作峰值,并且树状数组的下标是从1开始的,并且使用前缀和相减得到区间内的峰值}else{ // 单点修改int x = v[1];// 先将可能会发生改变的点复原for(int i = max(x-1,1); i <= min(x+1,n-2); i++) {update(i,-1);}nums[x] = v[2];// 再重新更新可能会发生变化的点for(int i = max(x-1,1); i <= min(x+1,n-2); i++) {update(i,1);}}}return ans;}
};// 线段树
struct SegTree
{vector<int> t;SegTree(int n): t(n<<2){}void up(int o) {t[o] = t[o*2+1] + t[o*2+2];}void build(const vector<int>&a,int o,int l,int r) {if(l == r) {t[o] = 1;return;}int mid = (l + r) >> 1;build(a, o*2+1, l, mid);build(a, o*2+2, mid+1, r);up(o);}void update(int o,int l, int r, int i, int val) {if(l==r){t[o] = val;return;}int mid = (l + r) >> 1;if(i <= mid) update(o*2+1, l, mid, i, val);else update(o*2+2, mid+1, r, i, val);up(o);}int query(int o, int l, int r, int ql, int qr) {if(ql > qr) return 0;if(ql <= l && r <= qr)return t[o];int res = 0;int mid = (l + r) >> 1;if(mid >= ql) res += query(o*2+1, l, mid, ql, qr);if(mid < qr) res += query(o*2+2, mid+1, r, ql, qr);return res;}
};
class Solution {
public:vector<int> countOfPeaks(vector<int>& nums, vector<vector<int>>& q) {int n = nums.size();SegTree st(n);auto update = [&](int i, int val) {if(nums[i] > nums[i-1] && nums[i] > nums[i+1]) {st.update(0,0,n-1,i,val);}};for(int i = 1; i < n-1; i++) {update(i,1);}vector<int> ans;for(auto v:q) {if(v[0]==1) { // 区间查询ans.push_back(st.query(0,0,n-1,v[1]+1,v[2]-1));}else{ // 单点修改int x = v[1];for(int i = max(x-1,1); i <= min(x+1,n-2); i++) {update(i,0);}nums[x] = v[2];for(int i = max(x-1,1); i <= min(x+1,n-2); i++) {update(i,1);}}}return ans;}
};
http://www.yayakq.cn/news/894376/

相关文章:

  • 赣县区建设局网站手机网站源文件
  • 制作网站免费wordpress 图片剪裁
  • 韩国展厅设计网站互联网创业项目整合网站
  • 海南省住房和城乡建设厅官网网站首页比较好的做网站
  • 怎么建一个小说网站wordpress栏目
  • 什么对网站建设起到计划和指导作用企业网站的建设论文
  • Wordpress 源码 商城南京seo关键词优化预订
  • 音乐网站开发文档源码分享
  • 手机网站建站软件wordpress 社交插件
  • 做论坛网站需要多大空间建设银行江苏省行网站
  • 摄影网站开题报告企业网站建设不足
  • 对方把我的网站他网站内页友情链接 站长工具检测到是无反链推推蛙seo
  • html5风格网站特色怎么做网站推广知乎
  • 东圃做网站常州商城网站制作公司
  • 北京网站建站推广2003系统做网站
  • 网站布局设计怎么写个人网站经营 合法么
  • 上传网站到二级域名百度seo点击排名优化
  • 医院网站设计模板苏州网站设计选哪家
  • 江苏网站建设公司h5编辑软件
  • 广东微信网站建设哪家专业浙江建设工程信息网高工评选
  • 学校响应式网站模板网页制作怎么下载
  • 电影网站制作教程销售管理系统实验报告
  • 网站维护中页面模板什么是网络营销促销
  • 无锡市梁溪区建设局网站江西省赣州市教育局
  • 网站用户后台是怎么做的网站建设和设计
  • shopify与wordpress网站关键词优化方案
  • 网站如何进行优化设计衡阳北京网站建设
  • 给自己女朋友做的网站阿里巴巴运营工资大概多少
  • 网站做搜索关键字好吗电商境外如何做推广
  • 前端一般怎样做网站做冠县梨园网站怎么做