Leetcode】周赛203 查找大小为M的最新分组
题意:
给你一个数组 arr ,该数组表示一个从 1 到 n 的数字排列。有一个长度为 n 的二进制字符串,该字符串上的所有位最初都设置为 0 。
在从 1 到 n 的每个步骤 i 中(假设二进制字符串和 arr 都是从 1 开始索引的情况下),二进制字符串上位于位置 arr[i] 的位将会设为 1 。
给你一个整数 m ,请你找出二进制字符串上存在长度为 m 的一组 1 的最后步骤。一组 1 是一个连续的、由 1 组成的子串,且左右两边不再有可以延伸的 1 。
返回存在长度 恰好 为 m 的 一组 1 的最后步骤。如果不存在这样的步骤,请返回 -1 。
题解:
原本想着就是模拟一下就好了,可是模拟代码在我的codeblocks上跑的没问题,在力扣上运行又是另一种答案,令人头秃

1 #include<stack>
2 #include<queue>
3 #include<map>
4 #include<cstdio>
5 #include<cstring>
6 #include<iostream>
7 #include<algorithm>
8 #include<vector>
9 #define fi first
10 #define se second
11 #define pb push_back
12 using namespace std;
13 typedef long long ll;
14 const int maxn=2000+10;
15 const int mod=1e9+7;
16 const double eps=1e-8;
17 const int INF = 0x3f3f3f3f;
18 class Solution {
19 public:
20 int findLatestStep(vector<int>& r, int m) {
21 int len=r.size();
22 int w[100005],v[100005],sum=0;
23 memset(w,0,sizeof(w));
24 memset(v,0,sizeof(v));
25 for(int i=0;i<len;++i)
26 {
27 int aim=r[i];
28 //cout<<aim<<v[aim-1]<<v[aim+1]<<endl;
29 if(v[aim-1]==0 && v[aim+1]==0)
30 {
31 v[aim]=1;
32 //cout<<aim<<endl;
33 w[1]++;
34 }
35 else if(v[aim-1] && v[aim+1]==0)
36 {
37 w[v[aim-1]]--;
38 v[aim-v[aim-1]]=v[aim-1]+1;
39 v[aim]=v[aim-1]+1;
40 w[v[aim]]++;
41 }
42 else if(v[aim-1]==0 && v[aim+1])
43 {
44 w[v[aim+1]]--;
45 v[aim+v[aim+1]]=v[aim+1]+1;
46 v[aim]=v[aim-1]+1;
47 w[v[aim]]++;
48 }
49 else
50 {
51 w[v[aim+1]]--;
52 w[v[aim-1]]--;
53 v[aim-v[aim-1]]=v[aim-1]+1+v[aim+1];
54 v[aim+v[aim+1]]=v[aim+1]+1+v[aim-1];
55 w[v[aim+1]+v[aim-1]+1]++;
56 }
57 //cout<<w[m]<<"******"<<v[aim+1]<<endl;
58 if(w[m]>0) sum=max(sum,i+1);
59 }
60 if(sum)
61 return sum;
62 else return -1;
63 }
64 };
65 int main()
66 {
67 vector<int>r;
68 int n,m;
69 cin>>n;
70 for(int i=1;i<=n;++i)
71 {
72 int x;
73 cin>>x;
74 r.push_back(x);
75 }
76 cin>>m;
77 Solution s;
78 int ans=s.findLatestStep(r,m);
79 cout<<m<<endl;
80 }
然后就换一种方式并查集去写,使用v数组来记录每一个位置的父节点,cnt用来记录每个位置的长度,w数组用来记录某个长度连续的1出现次数
没什么好说的,看代码
class Solution {
public:
int v[100010];
int cnt[100010];
int w[100010];
int findp(int x){
if(v[x]!=x){
v[x]=findp(v[x]);
}
return v[x];
}
void merge(int l,int r,int newp){
if(cnt[l]) v[l]=newp;
if(cnt[r]) v[r]=newp;
cnt[newp]=1+cnt[l]+cnt[r];
w[1+cnt[l]+cnt[r]]++;
}
int findLatestStep(vector<int>& arr, int m) {
int n=arr.size();
for(int i=0;i<n+2;i++) v[i]=i;
memset(cnt,0,sizeof(cnt));
memset(w,0,sizeof(w));
int res=-1;
for(int i=0;i<n;i++){
int l=findp(arr[i]-1),r=findp(arr[i]+1);
w[cnt[l]]--;
w[cnt[r]]--;
merge(l,r,arr[i]);
if(w[m]>0) res=i+1;
}
return res;
}
};
Leetcode】周赛203 查找大小为M的最新分组的更多相关文章
- LeetCode周赛#203 题解
1561. 你可以获得的最大硬币数目 #贪心 题目链接 题意 有 3n 堆数目不一的硬币,你和你的朋友们打算按以下方式分硬币: 每一轮中,你将会选出 任意 3 堆硬币(不一定连续). Alice 将会 ...
- SQL查找大小为n的连续区间
数据准备 create table sequence ( seq int not null primary key ); insert into values(3); insert into valu ...
- 【Leetcode周赛】从contest-91开始。(一般是10个contest写一篇文章)
Contest 91 (2018年10月24日,周三) 链接:https://leetcode.com/contest/weekly-contest-91/ 模拟比赛情况记录:第一题柠檬摊的那题6分钟 ...
- 不占用额外内存空间能否做到 将图像旋转90度 N × N矩阵表示的图像,其中每个像素的大小为4字节
给定一幅由N × N矩阵表示的图像,其中每个像素的大小为4字节,编写一种方法,将图像旋转90度. 不占用额外内存空间能否做到? 示例 1: 给定 matrix = [ [1,2,3], [4,5,6] ...
- Linux如何查找大文件或目录总结
在Windows系统中,我们可以使用TreeSize工具查找一些大文件或文件夹,非常的方便高效,在Linux系统中,如何去搜索一些比较大的文件呢?下面我整理了一下在Linux系统中如何查找大文件或文件 ...
- 在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’;输出这个数组中的所有元素。
//在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’:输出这个数组中的所有元素. char [][]y=new char [10][10 ...
- 在主方法中定义一个大小为50的一维整型数组,数组i名为x,数组中存放着{1,3,5,…,99}输出这个数组中的所有元素,每输出十个换一行
package hanqi; import java.util.Scanner; public class Test7 { public static void main(String[] args) ...
- 生成大小为100的数组,从1到100,随机插入,不连续,也不重复[C#]
生成大小为100的数组,从1到100,随机插入,不连续,也不重复. 实现思路 生成一个100位的集合listA,放1到100 创建一个空的集合listB,用来存放结果 创建一个变量c,临时存储生成的数 ...
- 在linux/unix中查找大文件
在linux/unix中查找大文件,如查找大于100M文件的位置路径,查找等于10M文件的位置路径等等,下面就介绍几个实现快速查找的命令: 1. 查找指定目录下所有大于100M的文件,命令为 find ...
随机推荐
- 天梯赛练习 L3-010 是否完全二叉搜索树 (30分) 数组建树模拟
题目分析: 本题的要求是将n个数依次插入一个空的二叉搜索树(左大右小,且没有重复数字),最后需要输出其层次遍历以及判断是否是完全二叉搜索树,通过观察我们发现, 如果这个树是用数组建立的,那么最后输出的 ...
- Linux简单Shell脚本监控MySQL、Apache Web和磁盘空间
Linux简单Shell脚本监控MySQL.Apache Web和磁盘空间 1. 目的或任务 当MySQL数据库.Apache Web服务器停止运行时,重新启动运行,并发送邮件通知: 当服务器磁盘的空 ...
- 【Oracle】将数据库设为开机自启
由于某些特殊条件,需要将oracle数据库设置为开机自己,其实很简单 环境:oracle10gR2 1.修改/etc/oratab # This file is used by ORACLE util ...
- Apache目录详解
Apache的主要目录和配置文件理解 参考链接:http://httpd.apache.org/docs/2.4/misc/security_tips.html 一.Apache主要配置文件注释(演示 ...
- 一个div画同心圆
二话不说上代码 background-image:radial-gradient(7px,#00A4FF 50%,#fff 75%,#00A4FF 94%); 7px是圆的半径 效果:
- 消息队列之activeMQ
1.activeMQ的主要功能 实现高可用.高伸缩.高性能.易用和安全的企业级面向消息服务的系统 异步消息的消费和处理 控制消息的消费顺序 可以和Spring/springBoot整合简化编码 配置集 ...
- 技术基础 | Apache Cassandra 4.0基准测试
Apache Cassandra 4.0已经发布了Beta版,这是第一个支持JDK 11及更高JDK版本的Cassandra版本. 时延对于Apache Cassandra用户来说是个显而易见的关 ...
- Spring Security 实战干货:AuthenticationManager的初始化细节
1. 前言 今天有个同学告诉我,在Security Learning项目的day11分支中出现了一个问题,验证码登录和其它登录不兼容了,出现了No Provider异常.还有这事?我赶紧跑了一遍还真是 ...
- In Search of an Understandable Consensus Algorithm" (https://raft.github.io/raft.pdf) by Diego Ongaro and John Ousterhout.
In Search of an Understandable Consensus Algorithm" (https://raft.github.io/raft.pdf) by Diego ...
- (hive)hive优化(转载)
1. 概述 1.1 hive的特征: 可以通过SQL轻松访问数据的工具,从而实现数据仓库任务,如提取/转换/加载(ETL),报告和数据分析: 它可以使已经存储的数据结构化: 可以直接访问存储在Apac ...