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 ...
随机推荐
- 【JavaWeb】JSON 文件
JSON 文件 什么是 JSON JSON(JavaScript Object Notation),即 JS 对象符号. 是一种轻量级(相对于 XML 来说)的数据交换格式,易于阅读和编写,同时也易于 ...
- Java JDBC的 url 配置信息和Mybatis核心配置文件(MySQL 的配置信息)
JDBC 连接数据库的 url driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/smbms?uesSSL=true&u ...
- linux之curl工具
curl是一个利用URL语法在命令行下工作的文件传输工具,作用是发出网络请求,然后获取数据:它支持文件的上传和下载:支持多种通信协议. 一.查看网页源码 直接在 curl 命令后加上网址,默认会发送 ...
- SwiftUI 中一些和响应式状态有关的属性包装器的用途
SwiftUI 借鉴了 React 等 UI 框架的概念,通过 state 的变化,对 View 进行响应式的渲染.主要通过 @State, @StateObject, @ObservedObject ...
- 使用Logback日志
使用Logback日志 spring boot内部使用Logback作为日志实现的框架. Logback和log4j非常相似,如果你对log4j很熟悉,那对logback很快就会得心应手. logba ...
- 如何在C#中使用MSMQ
MSMQ (Microsoft消息队列)是Windows中默认可用的消息队列.作为跨计算机系统发送和接收消息的可靠方法,MSMQ提供了一个可伸缩.线程安全.简单和使用方便的队列,同时为你提供了在Win ...
- 阿里面试常问的redis数据结构,建议收藏
关于Redis redis是一个开源的使用C语言编写的一个kv存储系统,是一个速度非常快的非关系远程内存数据库.它支持包括String.List.Set.Zset.hash五种数据结构.除此之外,通过 ...
- CUDA 介绍
1. 介绍 1.1 GPU vs. CPU GPU 使用更多的晶体管进行数据处理,而不是数据缓存和流控制,因此可以提供高度的并行计算. GPU 可以通过计算来隐藏内存访问延迟,而不是依赖于大量的数据缓 ...
- UML 博客学习 后续继续完善
http://blog.csdn.net/monkey_d_meng/article/details/6005764 http://blog.csdn.net/badobad/article/det ...
- 从零开始学Java (五)条件选择
if switch while do while for break continue 这块对于有语言基础的人来说可以跳过了. 注意有个equals方法. 1 public class Main { ...