LeetCode.2612最少翻转次数C++

 【题目描述】

一个长度为n的数字arr,该数组中除了下标为p的位置为1,其他位置均为0。

一个banned数组,它的内容表示arr数组中的位置,也就是满足所有的arr[banned[i]]=0,其中banned[i]!=p。

返回一个大小为n的数组ans,其中ans[i]表示:数组arr经过多少次翻转可以让i位置出现1。

如果不能实现,则ans[i]=-1。

" 翻转大小为k的子数组,是指将该子数组逆序。"


【思路】

1,首先知道arr数组中p位置的值为1,即arr[p]=1,其余位置为0。目标是翻转大小为k的子数组,使得其他位置也出现1,求每个位置的翻转次数。

那么ans[p]=0,因为p位置不用翻转,本来就是1,所以翻转次数为0。

假设现在i位置的值为1。假设下标i经过一次翻转后的下标为j,这个下标j肯定不是一个特定的下标,它代表翻转后的所有可能的下标。那么我们可以将i和j看成用一条边连接,这条边的边权为1,表示从i位置翻转到j位置的翻转次数。可以理解为求最短路径的过程。

即已经知道了ans[i]的值,arr[i]=1。i位置经过一次翻转后的下标为j,将i和j看成是用一条边连接,这条边的边权为1,代表翻转次数。那么就可以得到ans[j]=asn[i]+1。下次再从j位置开始扩展。

可以看出这是一个BFS的过程。下面的问题是怎么求 i 翻转后的下标 j ???


2,对于一个 子数组【L,R】

我们对于这整个区间翻转的话,可以得到:

下标L翻转后的下标为R。

下标L+1翻转后的下标为R-1。

下标L+2翻转后的下标为R-2。

下标L+3翻转后的下标为R-3。

..............

下标R翻转后的下标为L。


可以得出,翻转前后的下标之和始终为L+R。所以于下标i,翻转后的下标j=L+R-i。

再者,对于区间【L,R】,可以左移,L+1,R+1。也可以右移L-1,R-1。

而对于翻转后的下标j=L+R-i而言,就是+2或者-2。

所以翻转后的下标j=L+R-i,其实是一个公差为2的等差数列,要么都是偶数,要么都是奇数。

3,下标i翻转后的下标j的范围。

对于下标i,当它在子数组的最右侧时,可以得到翻转后的下标j=i-k+1,为最小值。

对于下标i,当它在子数组的最左侧时,可以得到翻转后的下标j=i+k-1,为最大值。

还有一些特殊情况:

当i<k-1时,i不可能在子数组的右端点。当i>n-k时,i不可能在子数组的左端点。

例如 对于k=4,长度为4的子数组,右端点最小是k-1=3,当i=0,1,2,i不可能是数组的右端点;左端点最大是n-k,当i>n-k,i不可能在子数组的左端点。

i<k-1的情况,当子数组在整个数组的最左边时,L=0,R=k-1。i翻转后的下标j=L+R-1=k-1-i。小于k-i-1的下标无法翻转得到。

i>n-k的情况,当子数组在整个数组的最右边时,L=n-k,R=n-1。翻转后的下标为j=L+R-i=2*n-k-i-1。大于2*n-k-i-1的下标无法翻转得到。

综上所述:

i翻转后的最小值为max(i-k+1,k-1-i)。

i翻转后的最大值为min(i+k-1,2*n-k-i-1)。

【算法实现】

BFS+有序集合

由于翻转后的下标是一个公差为2的等差数列,要么都是奇数,要么都是偶数。

我们和可以用两个有序集合来维护没有访问过的奇数下标和偶数下标。

这些下标不能在banned数组中出现过,banned数组是限制数组。

还有下标p也不需要出现在集合中,因为刚开始初始化ans[p]=0,已经访问过了。

接下来BFS模拟。

翻转后的下标访问过后,要从有序集合中删除,避免重复访问。

删除时可以直接使用C++标准库中的方法。删除一个迭代器后,会返回下一个迭代器。

不会造成迭代器失效问题。

代码语言:javascript

AI代码解释

class Solution { public: vector<int> minReverseOperations(int n, int p, vector<int>& banned, int k) { unordered_set<int> ban(banned.begin(),banned.end()); set<int> index[2];//维护没有访问过的偶数下标和奇数下标 for(int i=0;i<n;i++) if(i!=p&&!ban.count(i))//p是起点,已经访问过了 index[i%2].insert(i); //BFS queue<int> q; q.push(p); vector<int> ans(n,-1); ans[p]=0; //BFS遍历,边权为1,找最短路径 while(q.size()) { int i=q.front(); q.pop(); //找出可翻转的区间 int mn=max(i-k+1,k-i-1); int mx=min(i+k-1,2*n-k-i-1); auto& st=index[mn%2]; for(auto it=st.lower_bound(mn);it!=st.end()&&*it<=mx;it=st.erase(it)) { ans[*it]=ans[i]+1; q.push(*it); } } return ans; } };

Read more

Flutter 三方库 xpath_selector 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、透明、精准的 HTML/XML 数据抓取与 Web 结构解析引擎

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 xpath_selector 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、透明、精准的 HTML/XML 数据抓取与 Web 结构解析引擎 在鸿蒙(OpenHarmony)系统的网络爬虫、自动化测试审计、或者是从复杂的第三方 Web 公告(HTML)中提取关键数据(如新闻标题、资产负债表)时,如何摆脱凌乱的正向正则(Regex),转而使用业界标准的 XPath 语法进行语义化选取?xpath_selector 为开发者提供了一套工业级的、基于 Dart 的 HTML/XML 结构化查询方案。本文将深入实战其在鸿蒙端数据治理中的应用。 前言 什么是 XPath Selector?

By Ne0inhk

Flutter 三方库 bones_ui 的鸿蒙化适配指南 - 打造直观、响应式的 Web 风格 UI 交互体验

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 bones_ui 的鸿蒙化适配指南 - 打造直观、响应式的 Web 风格 UI 交互体验 Flutter for OpenHarmony 开发者在构建具有 Web 质感的跨平台应用时,UI 框架的选择至关重要。本文将带大家深度调研 Dart 三方库 bones_ui 在鸿蒙系统上的适配方案,探索如何利用其直观的组件架构,加速鸿蒙桌面级应用的开发效率。 前言 在移动端和桌面端融合的今天,开发者往往希望一套代码能同时适配多种屏幕形态。bones_ui 原生为 Dart Web 打造,但在 Flutter for OpenHarmony 的大前端生态中,其简洁的 UI 组件设计思想对我们构建鸿蒙跨平台应用具有极大的参考价值。

By Ne0inhk
【数据结构-初阶】顺序表相关习题

【数据结构-初阶】顺序表相关习题

🎈主页传送门:良木生香 🔥个人专栏:《C语言》 《数据结构-初阶》 《程序设计》 🌟人为善,福随未至,祸已远行;人为恶,祸虽未至,福已远离 上期回顾:在上一篇文章中(【数据结构-初阶】详解线性表(1)---顺序表),我们详细介绍了线性表系列第一种数据结构---顺序表,这个数据结构是以数组为底建立的,也学习了如何用线性表进行增删查改的操作,那么我们今天就用顺序表进行解题~~~   题目一:移除元素 这是题目链接:27.移除元素,下面是具体的题目与示例: 由题意知,这道题是想让我们将数组中值为val的元素删除,我们能怎么做呢? 创建新的数组?那不行,题目已经要求我们只能在原地进行操作了,就意味着不能创建新的数组来进行辅助 那该怎么办呢?简单,我们只需用上算法中最基础的---双指针算法了 我们用双指针,不一定用真的指针指向某个元素,有时也可以用下标,讲究的是一种算法思想,并没有一定的形式 我们用两个指针,刚开始都同事之下那个num数组的第一个元素,随后将其中一个指针用于遍历数组,如果两个指针指向的内容不相同,那就将内容进行交换,两个指针同时向后移动一位;如果相同

By Ne0inhk

黑马程序员java web学习笔记--后端进阶(二)SpringBoot原理

目录 1 配置优先级 2 Bean的管理 2.1 Bean的作用域 2.2 第三方Bean 3 SpringBoot原理 3.1 起步依赖 3.2 自动配置 3.2.1 实现方案 3.2.2 原理分析 3.2.3 自定义starter 1 配置优先级 SpringBoot项目当中支持的三类配置文件: * application.properties * application.yml ❤ * application.yaml 配置文件优先级排名(从高到低):properties配置文件 > yml配置文件 > yaml配置文件 虽然springboot支持多种格式配置文件,但是在项目开发时,推荐统一使用一种格式的配置。

By Ne0inhk