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 ...
随机推荐
- 【Problems】:JSON parse error: Invalid UTF-8 start byte 0xbd;
简单记录一下 ,我本地开发环境这样写测试时没有问题, @ApiOperation(value="取消关注") @PostMapping("cancelFollow&quo ...
- 【排序基础】1、选择排序法 - Selection Sort
文章目录 选择排序法 - Selection Sort 为什么要学习O(n^2)的排序算法? 选择排序算法思想 操作:选择排序代码实现 选择排序法 - Selection Sort 简单记录-bobo ...
- 【Linux】Linux系统dev/目录下的tty
终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备.tty是Teletype的缩写.Teletype是最早出现的一种终端设备,很象电传打字机(或者说就是),是由Teletyp ...
- CentOS6.8安装及各种坑
实现目的:用U盘安装CentOS 6.2 32位系统 所需工具: 一.UltraISO(用来制作U盘启动) 下载地址:http://www.newhua.com/soft/614.htm 二.Cent ...
- 【Oracle】查看表或视图的创建语句
这里用到的是Oracle的DDL语句的用法 用于获得某个schema下所有的表.索引.视图.存储过程.函数的DDL set pagesize 0 set long 90000 set feedback ...
- APP测试之Monkey测试
一.简介 1.什么是Monkey测试? Monkey testing,也有人叫做搞怪测试.就是用一些稀奇古怪的操作方式去测试被测试系统,以测试系统的稳定性.Monkeytest,一般指这样的测试活动, ...
- C# url的编码解码,xml和json的序列化和反序列化
参考中国慕课网dot net web编程应用程序实践 using System; using System.Collections.Generic; using System.IO; using Sy ...
- vue、element-ui 后台菜单切换重新请求数据
我们在做后台管理系统时,通常将数据请求挂载到created或mounted钩子中,但这样引发的问题是它只会被出发一次,如果不同菜单中数据关联性较大,切换过程中未及时更新数据,容易引发一些问题,这种情况 ...
- H3C防火墙开启区域间互访
配置ip和路由以及将端口放至Untrust之后,外网还是不通,需要以下命令 interzone policy default by-priority 或者下面: security-zone intra ...
- 1 flume快速入门——十分钟学会flume
flume ## 1.1 Flume定义 Flume是Cloudera提供的一个高可用的,高可靠的,分布式的海量日志采集.聚合和传输的系统.Flume基于流式架构,灵活简单. 大数据框架大致分为3类: ...