acwing 651. 逛画展

地址 https://www.acwing.com/problem/content/653/

博览馆正在展出由世上最佳的 M 位画家所画的图画。

wangjy想到博览馆去看这几位大师的作品。

可是,那里的博览馆有一个很奇怪的规定,就是在购买门票时必须说明两个数字,a和b,代表他要看展览中的第 a 幅至第 b 幅画(包含 a 和 b)之间的所有图画,而门票的价钱就是一张图画一元。

为了看到更多名师的画,wangjy希望入场后可以看到所有名师的图画(至少各一张)。

可是他又想节省金钱。。。

作为wangjy的朋友,他请你写一个程序决定他购买门票时的 a 值和 b 值。

输入格式

第一行包含两个整数 N 和 M,表示图画总数和画家数量。

第二行包含 N 个整数,它们都介于 1 和 M 之间,代表画作作者的编号。

输出格式

输出两个整数 a 和 b。

数据保证有解,如果存在多个解,则输出 a 最小的那个解。

数据范围

1N1061≤N≤106,
1M20001≤M≤2000

输入样例:

12 5
2 5 3 1 3 2 4 1 1 5 4 3

输出样例:

2 7

主要是考虑使用滑动窗口 使用哈希记录其中各个画家出现的次数 但是tle

#include <iostream>
#include <map>
using namespace std;

const int N = 1e6+10;

int huaArr[N];

map<int,int> mapm;

int n ,m;

int cnt = 0;

int ans = 1e9;
int ansa = 1e9;
int ansb = 1e9;


int main()
{
     ios::sync_with_stdio(false);
    cin >> n >> m;
    for(int i =1;i<= n;i++){
        cin >> huaArr[i];
    }
    
    int l = 1; int r= 0;
    
    for(int i =1;i <=n;i++){
        //i 幅画放去l r 区间
        if (mapm[huaArr[i]] == 0)//曾经没有出现过
            cnt++;
        r++;
        mapm[huaArr[i]]++;
        
        //开始进行缩减
        while(mapm[huaArr[l]] >=2){
            //该副画 排除区间
            mapm[huaArr[l]]--;
            l++;
        }
        
        if(cnt >= m && r-l+1 < ans){
            ans = r-l+1;
            ansa = l;
            ansb = r;
        }
    }
    
    cout << ansa << " " << ansb << endl;
    
    
    return 0;
}
tle

后面参考其他同学的代码  (https://www.acwing.com/blog/content/150/

把自己的map改成了vector  过了。这也是 oj与leetcode的区别吧 

 1 #include <iostream>
 2 #include <map>
 3 #include <vector>
 4 using namespace std;
 5 
 6 const int N = 1e6+10;
 7 
 8 vector<int> huaArr(N,0);
 9 
10 vector<int> v(N,0);
11 int n ,m;
12 
13 int cnt = 0;
14 
15 int ans = 1e9;
16 int ansa = 1e9;
17 int ansb = 1e9;
18 
19 
20 int main()
21 {
22      ios::sync_with_stdio(false);
23     cin >> n >> m;
24     for(int i =1;i<= n;i++){
25         cin >> huaArr[i];
26     }
27     
28     int l = 1; int r= 0;
29     
30     for(int i =1;i <=n;i++){
31         //i 幅画放去l r 区间
32         if (v[huaArr[i]] == 0)//曾经没有出现过
33             cnt++;
34         r++;
35         v[huaArr[i]]++;
36         
37         //开始进行缩减
38         while(v[huaArr[l]] >=2){
39             //该副画 排除区间
40             v[huaArr[l]]--;
41             l++;
42         }
43         
44         if(cnt >= m && r-l+1 < ans){
45             ans = r-l+1;
46             ansa = l;
47             ansb = r;
48         }
49     }
50     
51     cout << ansa << " " << ansb << endl;
52     
53     
54     return 0;
55 }
ac
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
阿里打赏 微信打赏
原文地址:https://www.cnblogs.com/itdef/p/10858238.html