题意:

给你一个数组 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的最新分组的更多相关文章

  1. LeetCode周赛#203 题解

    1561. 你可以获得的最大硬币数目 #贪心 题目链接 题意 有 3n 堆数目不一的硬币,你和你的朋友们打算按以下方式分硬币: 每一轮中,你将会选出 任意 3 堆硬币(不一定连续). Alice 将会 ...

  2. SQL查找大小为n的连续区间

    数据准备 create table sequence ( seq int not null primary key ); insert into values(3); insert into valu ...

  3. 【Leetcode周赛】从contest-91开始。(一般是10个contest写一篇文章)

    Contest 91 (2018年10月24日,周三) 链接:https://leetcode.com/contest/weekly-contest-91/ 模拟比赛情况记录:第一题柠檬摊的那题6分钟 ...

  4. 不占用额外内存空间能否做到 将图像旋转90度 N &#215; N矩阵表示的图像,其中每个像素的大小为4字节

    给定一幅由N × N矩阵表示的图像,其中每个像素的大小为4字节,编写一种方法,将图像旋转90度. 不占用额外内存空间能否做到? 示例 1: 给定 matrix = [ [1,2,3], [4,5,6] ...

  5. Linux如何查找大文件或目录总结

    在Windows系统中,我们可以使用TreeSize工具查找一些大文件或文件夹,非常的方便高效,在Linux系统中,如何去搜索一些比较大的文件呢?下面我整理了一下在Linux系统中如何查找大文件或文件 ...

  6. 在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’;输出这个数组中的所有元素。

    //在主方法中定义一个大小为10*10的二维字符型数组,数组名为y,正反对角线上存的是‘*’,其余 位置存的是‘#’:输出这个数组中的所有元素. char [][]y=new char [10][10 ...

  7. 在主方法中定义一个大小为50的一维整型数组,数组i名为x,数组中存放着{1,3,5,…,99}输出这个数组中的所有元素,每输出十个换一行

    package hanqi; import java.util.Scanner; public class Test7 { public static void main(String[] args) ...

  8. 生成大小为100的数组,从1到100,随机插入,不连续,也不重复[C#]

    生成大小为100的数组,从1到100,随机插入,不连续,也不重复. 实现思路 生成一个100位的集合listA,放1到100 创建一个空的集合listB,用来存放结果 创建一个变量c,临时存储生成的数 ...

  9. 在linux/unix中查找大文件

    在linux/unix中查找大文件,如查找大于100M文件的位置路径,查找等于10M文件的位置路径等等,下面就介绍几个实现快速查找的命令: 1. 查找指定目录下所有大于100M的文件,命令为 find ...

随机推荐

  1. explain select * from xuehao;

    mysql> explain select * from xuehao;+----+-------------+--------+------+---------------+------+-- ...

  2. 【Spring】IoC概述

    Spring框架的核心概念--IoC IoC IoC是Inversion of Control的简写,翻译成汉语就是"控制反转".IoC并不是一门技术,而是一种设计思想,在Spri ...

  3. rac双节点+物理DG

    注:以下文章均是看了黄伟老师的视频,记录为博客供以后使用. 双节点RAC搭建: http://blog.csdn.net/imliuqun123/article/details/76171289 RA ...

  4. 使用Logback日志

    使用Logback日志 spring boot内部使用Logback作为日志实现的框架. Logback和log4j非常相似,如果你对log4j很熟悉,那对logback很快就会得心应手. logba ...

  5. 中间件:ElasticSearch组件RestHighLevelClient用法详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.基础API简介 1.RestHighLevelClient RestHighLevelClient的API作为ElasticSearch备 ...

  6. uni-app开发经验分享十五: uni-app 蓝牙打印功能

    最近在做uni-app项目时,遇到了需要蓝牙打印文件的功能需要制作,在网上找到了一个教程,这里分享给大家. 引入tsc.js 简单得引入到自己所需要得页面中去,本次我们只要到了标签模式,他同时还有账单 ...

  7. Python赋值、浅复制和深复制

    Python赋值.浅复制和深复制 ​ 首先我们需要知道赋值和浅复制的区别: 赋值和浅复制的区别 赋值,当一个对象赋值给另一个新的变量时,赋的其实是该对象在栈中的地址,该地址指向堆中的数据.即赋值后,两 ...

  8. Centos GitLab 配置

    如果重启之后,gitlab-ctl restart报"runsv no running"错,先运行下面命令 systemctl start gitlab-runsvdir.serv ...

  9. Centos 7 Rabbitmq 安装并开机启动

    准备工作 安装wget yum install -y wget rabbitmq安装需要依赖erlang,erlang安装参考:https://www.cnblogs.com/swyy/p/11582 ...

  10. Jenkins部署web项目到Tomcat(热部署)

    使用这个方式的话需要tomcat中有初始时Manage这个项目,本质上是通过http://ip:port/manager/html这个地址的上传接口进行上传,进行热部署(需要远程tomcat 必须开启 ...