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

网页设计实验报告实验内容网站seo关键词优化技巧

网页设计实验报告实验内容,网站seo关键词优化技巧,武汉营销型网站建设公司哪家专业,济南工程建设信息网​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 无重叠区间划分字母区间合并…

在这里插入图片描述

​📝个人主页:@Sherry的成长之路
🏠学习社区:Sherry的成长之路(个人社区)
📖专栏链接:练题
🎯长路漫漫浩浩,万事皆有期待

文章目录

  • 无重叠区间
  • 划分字母区间
  • 合并区间
  • 总结:

今天的三道题都是重叠区间的题,也是代码简单但思路难想,其中第二题不太算贪心,但是也能贪心写出来,但是这里不给贪心代码,因为挺难写的。

无重叠区间

435. 无重叠区间 - 力扣(LeetCode)
在这里插入图片描述

这道题是让我们返回要删除几个区间才能达到该数组内部,不再出现重叠区间了,其实并不需要进行真正的删除区间模拟,因为我们只需要返回要删除区间的个数,并不是要真的在数组里直接删除。

应该按照左边界排序还是右边界排序呢?其实理论上来说,都是可行的,但是左边界排序不好理解,我们采用对右边界从小到大排序,然后正向的遍历数组。由于我们排完序将右边界小的值排在了前面,所以我们可以按照先找非重叠的部分有几个,然后用总数减去非重叠就得到了我们要删除几个区间,直接求要删除的重叠区间个数是十分困难的。

我们排完序的第一个区间一定是右区间最小的,我们以它开始,寻找一个区间满足左区间大于或等于它,这时再按照新找到的区间的右区间接着去找下一个区间,每找到一个新区间,自增计数器。

class Solution {
public:static bool cmp(const vector<int>&a,const vector<int>&b){return a[1]<b[1];}int eraseOverlapIntervals(vector<vector<int>>& intervals) {if(intervals.size()==0){return 0;}sort(intervals.begin(),intervals.end(),cmp);int count=1;int end=intervals[0][1];for(int i=1;i<intervals.size();i++){if(end<=intervals[i][0]){end=intervals[i][1];count++;}}return intervals.size()-count;}
};

再强调一下,是按照右区间大小排的序,所以不用担心即使有左边界小右边界很大的区间,它也不会被先遍历到。

划分字母区间

763. 划分字母区间 - 力扣(LeetCode)
在这里插入图片描述

划分字母区间更像是回溯算法里的切割字符串的问题,实际上我认为这种方法应该貌似也是可行的。但是在这里我们要介绍的不是那种回溯递归的方法,而是用一个标记数组,标记每一个不同的字母最远出现在哪一个位置,做完了标记数组之后,我们再进行对字符串的分割。

要注意,分割后的每一块区域重新组合应该还是能得到原来字符串,所以不能选用会影响字符串顺序的算法。

我们定义两个变量left和right,left存的是当前要分割区间的最左端下标,right是最右端,用循环遍历该字母区间,如果碰到了当前字母在标记数组中的值比现在的right大,那么更新right值。直到变量i与right值相等,我们进行相减+1,压入返回数组中,加1是因为我们求得是划分的区间有个字母。

class Solution {
public:vector<int> partitionLabels(string S) {int hash[27] = {0}; for (int i = 0; i < S.size(); i++) { hash[S[i] - 'a'] = i;}vector<int> result;int left = 0;int right = 0;for (int i = 0; i < S.size(); i++) {right = max(right, hash[S[i] - 'a']); if (i == right) {result.push_back(right - left + 1);left = i + 1;}}return result;}
};

标记数组这个做题思路还是很巧妙的,让right存储最大值,相当于实时的更新分割线所处的地方,i和right相等时,说明了当前分割线以内都是可以被分割的,后面不会出现相同字母,因为标记数组标记了这些字母最远出现在哪里。在分割完毕的时候,我们再更新left的值。

合并区间

56. 合并区间 - 力扣(LeetCode)
在这里插入图片描述

合并区间我觉得和无重叠区间差不多,都是让数组内不出现重叠区间。只不过这个合并区间是真的要返回合并后的区间。思路其实我觉得能做出第一道题或许会有做出这道题的可能。

思路是先排序,但是和上一个不一样的是,这道题要从左区间从小到大排序好做一点,因为它的思路是直接合并重叠部分区间,而区别于第一道题的我们是找出非重叠的区间个数,那道题我们是避免找到重叠的,而这道题我们按照左区间从小到大的好处是,左区间小的会排在一起,这样我们比较时候发现第二个区间如果它的左区间小于前一个的右区间,则说明两区间一定有某一部分发生重叠,将其合并后,将合并区间看做整体扩大其右边界范围,直到找不出下一个的左区间小于上一个右区间为止,将改后区间加入数组,然后全部遍历后返回。

class Solution {
public:
static bool cmp(vector<int>&a,vector<int>&b)
{return a[0]<b[0];
}vector<vector<int>> merge(vector<vector<int>>& intervals) {vector<vector<int>>result;if(intervals.size()==0)return result;sort(intervals.begin(),intervals.end(),cmp);result.push_back(intervals[0]);for(int i=1;i<intervals.size();i++){if(result.back()[1]>=intervals[i][0]){result.back()[1]=max(result.back()[1],intervals[i][1]);}else result.push_back(intervals[i]);}return result;}
};

这是代码实现的缩减部分,主要就是比较区间然后不断改变右区间的值,实现了区间的合并,也并不是真正的删除重叠的区间,然后扩充。这里的else的目的是,如果当前判断到的区间不符合重叠了,那直接加入到数组里,然后用这个新加入的区间再重复之前的比较,往复便能实现所谓合并区间。

总结:

今天我们完成了无重叠区间、划分字母区间、合并区间三道题,相关的思想需要多复习回顾。接下来,我们继续进行算法练习。希望我的文章和讲解能对大家的学习提供一些帮助。

当然,本文仍有许多不足之处,欢迎各位小伙伴们随时私信交流、批评指正!我们下期见~

在这里插入图片描述

http://www.hengruixuexiao.com/news/12751.html

相关文章:

  • 前端响应式布局聊城优化seo
  • 小说网站防盗做的好网站怎么搭建
  • windows10前段网站建设网络销售平台上市公司有哪些
  • 网站如何做用户的实名认证网站seo方案案例
  • 做网站排名费用多少百度关键词排名手机
  • 全屏网站设计尺寸百度经验实用生活指南
  • 淘宝优惠券网站建设宁波网站推广哪家公司好
  • 俄语网站建设公司网络推广客服好做吗
  • 深圳做商城网站seo课程简介
  • 山东济南网网站建设网络营销名词解释答案
  • 网站空间送域名价格表在线h5免费制作网站
  • 网站后台点击添加图片没有反应经典软文案例
  • 哈尔滨网站域名部门模板网站好还是自助建站好
  • 杭州网站推广优化最有效的推广方法
  • 上海网页制作报价搜索引擎优化seo多少钱
  • 网站滚动条北京百度竞价
  • 邻水县规划和建设局 网站产品全网营销推广
  • cms 动态网站开发抖音优化是什么意思
  • web服务器架构seo的五个步骤
  • 平面设计可以做网站可视化网页制作工具
  • 佛山seo排名培训学校
  • 定制企业网站开发公司怎么给产品找关键词
  • 空间ip地址访问网站西安快速排名优化
  • 海南做网站seo网站优化方案案例
  • wordpress 默认搜索引擎windows优化大师收费
  • 广州哪里有学做网站的seo关键词首页排名代发
  • wordpress slider青岛seo服务哪家好
  • 建模e-r跟做网站有什么关系网站关键词优化
  • 万网做网站给网站源码企业网站设计优化公司
  • 网站建设要准备什么资源网站优化排名优化