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

广西上林县住房城乡建设网站/重庆疫情最新情况

广西上林县住房城乡建设网站,重庆疫情最新情况,免费云服务器网站有哪些,公司网站建设的目标是什么题目在此:力扣 首先,先祝福自己本周周赛过了三题。耶耶耶耶耶耶!虽然第一题因为脑子不好使想了半天,还WA了一次。衷心祈祷今年力扣能上1800分!!! 这道题,我看了一些通过人数&#x…

题目在此:力扣

 首先,先祝福自己本周周赛过了三题。耶耶耶耶耶耶!虽然第一题因为脑子不好使想了半天,还WA了一次。衷心祈祷今年力扣能上1800分!!!

这道题,我看了一些通过人数,感觉不像是我等凡人能做出来,所以就退缩了。刚才看了题解,有点明白了,在这里记录一下。

1.i能翻转到哪些位置->i的对称点有哪些?

首先,我们考虑这样一个问题:对于数组中的元素i,从左右两个方向考虑,他最远的对称点的下标是什么?

我们先考虑特殊的情况,也是最简单的情况:i作为区间的左右端点,它的对称点分别是什么?

写到这里,我发现,有个ipad也挺好的,我就可以直接在ipad上画完放到博客里,而不用在纸上画完,再在白板上画了,忧桑~

 是不是很简单呢?现在我们算一下复杂的。

如果我们想反转一个数组,就要确认一下i所在区间中左右两个端点最远的下标,现在我们来讨论一下i能对称的最左边的下标:

然后讨论一下i可以对称到的最右边的下标:

那么现在给定一个下标i,我们可以求出通过i可以翻转得到的所有位置的边界了,也就得到了这些位置和i之间的距离的边界,即:

l = max(k - 1 - 2i, -(k-1)), r= min(2n-2i-k-1,k-1)

 求出这个又能怎么样呢?这就意味着对于i,当我们求出l和r这两个边界之后,i+l与i+r之间的值我们都可以翻转得到。

诶,等等,都可以得到吗?我看未必吧。

为什么未必呢,因为i可以与之进行翻转的位置,好像不是完全连续的序列,而是一个公差为2的数列啊?

我们举个例子看看:

 也就是说,i的对称点构成的数列,是一个公差为2的等差数列,则在不同的区间中i的对称点为:

i+l, i+l+2, i+l+4,....,i+r-2,i+r

那既然公差为2,说明奇数和奇数在一个数列中,偶数和偶数在一个数列中,我们就把数组中所有的元素按照奇偶性进行划分好了。

2.怎么求出所有可以访问到的点

我们已经求出了对于某个i所有可以反转到的位置,那么这个i我们怎么得到呢?我们回头再看一下题目:ans[i] 是将 1 放到位置 i 处的 最少 翻转操作次数。

仔细思考一下,从i可以翻转到很多其他的位置,从其他的位置又可以接着翻转,求的又是最少的操作次数,怎么这么像bfs的经典题型啊!

没错,就是bfs。我们把每个可以翻转得到的下标入队,然后枚举队中的每个元素,再看看他们能够翻转的下标。直到队中没有元素了,此时我们已经对所有可以反转的位置都访问过了。

好了,既然如此,上代码吧。

class Solution {
public:vector<int> minReverseOperations(int n, int p, vector<int>& banned, int k) {vector<int>res(n, -1);if(k == 1){  //特殊情况res[p] = 0;return res;}unordered_set<int>ban;for(int i = 0; i < banned.size(); i++) ban.insert(banned[i]);//因为i的对称点是按照公差为2进行枚举的,所以我们按照奇偶性把他们放到不同的集合中//用这两个集合枚举我们还没有跳到的位置set<int>st[2];for(int i = 0; i < n; i++){if(i != p && ban.count(i) == 0){st[i % 2].insert(i);}}queue<int>q;q.push(p);res[p] = 0;while(q.size()){int cur = q.front();q.pop();int l = max(k - 1 - 2 * cur, -(k - 1));int r = min(2 * n - 2 * cur - k - 1, k - 1);//判断一下是去奇数还是偶数的集合中查找元素int x = (cur + k - 1) % 2;  //观察一下确定奇偶性,cur肯定对应这个点,那么根据这个点的奇偶性就可以判断这个序列的奇偶性auto it = (st[x].lower_bound(cur + l)); //找到第一个大于等于cur+l的位置(其实就是这个数列的第一个元素),然后开始枚举后面连续的位置(在已经确定好奇偶性的集合,其实就是连续的奇数或者连续的偶数)while(it != st[x].end()){//如果遇到了第一个大于cur+r的位置,就停止枚举if(*it > cur + r) break;//集合中的元素都是没被访问过的,可以从cur一步跳过来//更新答案,从集合中去掉已经访问的元素res[*it] = res[cur] + 1; q.push(*it);it = st[x].erase(it);}}return res;}
};

剩下的小细节也在注释中标明了。今天的题解就写到这里,放上我的参考题解:

力扣 LeetCode 灵神的直播讲解,但是我进的迟了,没听。

力扣 好像也是广受好评的大神的题解,我主要看了这个。

就写到这里吧,说好了下午要看看java,结果看了一下午这道题,好想逃避科研,逃避找工作啊!!!

http://www.jmfq.cn/news/5197249.html

相关文章:

  • 网站描文本怎么做/网站seo关键词排名推广
  • 电商网站如何做优化/免费建网站软件下载
  • 做一个网站的价钱/深圳seo网络推广
  • 浙江建设报名网站/一键制作网站
  • 专业手机网站建设哪家好/推推蛙seo顾问
  • 南京做企业网站公司哪家好/免费网页制作成品
  • 重庆万州网站建设费用/自助建站系统破解版
  • 怎样做简易局域网站点/百度指数手机版
  • 做网站客服的工作流程/bt磁力链好用的引擎
  • 做外贸建网站多少钱/上海空气中检测出病毒
  • 公司官网网站建设想法/网站生成
  • 网易企业邮箱价格/山东网站seo
  • 设计服务网络建设方案/优化网站排名
  • 西安企业网站建设/网站统计分析工具的主要功能
  • 怎么做原创电影视频网站/百度seo排名优化是什么
  • 北京网站开发公司电话/推广产品引流的最佳方法
  • 提供网站建设商家/推广优化厂商联系方式
  • 厦门市网站建设公司/seo优化推广流程
  • 岗顶做网站公司/南京百度关键字优化价格
  • 莱芜市网站建设设计/google chrome浏览器
  • 做婚礼网站的公司简介/销售网络平台
  • html表格菜鸟教程/seo管理软件
  • 宜昌网站seo收费/html友情链接代码
  • 长沙做个网站多少钱/网络广告策划书案例
  • 学网站制作多少钱/学计算机哪个培训机构好
  • 网站开发技术发展史/企业文化墙
  • 网站建设与维护心得体会/seo做的比较牛的公司
  • 给自己企业怎么做网站/产品宣传推广方式有哪些
  • 专业做包装设计网站/青岛推广优化
  • 朝阳网站设计/企业培训机构哪家最好