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 ...
随机推荐
- tf.argmax(vector,axis)函数的使用
1.返回值 vector为向量,返回行或列的最大值的索引号: vector为矩阵,返回值是向量,返回每行或每列的最大值的索引号. 2.参数 vector为向量或者矩阵 axis = 0 或1 0:返回 ...
- 【Redis3.0.x】事务
Redis3.0.x 事务 基本概念 multi,exec,discard,watch 是 Redis 事务的基础,它们允许一步执行一组命令,有两个重要保证: 事务中的所有命令都被序列化并顺序执行.在 ...
- 【环境搭建】SSM 整合使用
SSM 整合使用 文章源码 搭建整合环境 整合说明 SSM 整合可以使用多种方式,但是选择 XML + 注解 的方式最为合适. 整合思路 搭建整合环境 Spring 环境搭建并测试 Spring 整合 ...
- 剑指offer 面试题10.2:青蛙变态跳台阶
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 编程思想 因为n级台阶,第一步有n种跳法:跳1级.跳2级.到跳n级跳1级,剩下 ...
- 从一次生产消费者的bug看看线程池如何增加线程
0 背景 某个闲来无事的下午,看到旧有的项目中,有个任务调度的地方都是同步的操作,就是流程A的完成依赖流程B,流程B的完成依赖流程C,按此类推. 作为一名垃圾代码生产者,QA的噩梦.故障报告枪手的我来 ...
- VBA实现相同行合并
帮人捣鼓了个VBA代码用来实现多行合并,具体需求为:列2/列3/列4 相同的情况下,则对应的行合并为一行,且列1用空格隔开,列5则相加: (对大多数办公室职员,VBA还算是提高效率的一个利器吧) 最终 ...
- MySQL where 条件字句查询
where 条件字句 搜索条件可由一个或多个逻辑表达式组成 , 结果一般为布尔值 逻辑运算符 运算符 语法 描述 and && a and b a && b 逻辑与 两 ...
- 【RAC】10grac添加节点,详细步骤
RAC物理结构 现在的RAC环境是二个节点: dbp,dbs, 这个实验就是添加节点dbi. dbp,dbs和dbi节点的信息规划如下: 服务器主机名 dbp dbs dbi 公共IP地址(eth0) ...
- 【ORA】ORA-4031错误分析和解决办法
1. ORA-4031错误的原因,一般是大量的hard parse导致了shared pool中的free list中产生大量的内存小碎片,当一个需要很大内存来进行hard parse的sql语句到来 ...
- CTFshow萌新赛-密码学签到
查看密码信息 猜测为base家族 存在"^"符号,所以应该是在base64以上 使用base85解密 成功拿到flag