题意:
给一个数组,记数组中出现次数最多的元素出现的次数为这个数组的美丽值,求这个数组长度最短的子数组(要连续),使得该子数组的美丽值与原数组美丽值相等。要求输出子数组的起始和结束位置下标(从1开始)。
解析:
也是个水题。每个数最大才106,用hash存储每个数出现的次数即可。输入的时候用一个结构体记录最左边的位置,和最右边的位置,以及区间的长度和每个值出现的次数,再把hash存入vector中,最后在排序一遍,优先按照出现的次数排序一遍,如果出现次数相同,按照区间的大小排序。最后输出vector的第一个。
my code
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <vector>
#include <map>
using namespace std;
const int N = 1e5 + 10;
struct Node {
int st, end, len, cnt;
Node() {
st = end = len = cnt = 0;
}
Node(int _st, int _end, int _len, int _cnt) {
st = _st, end = _end, len = _len;
cnt = _cnt;
}
};
map<int, Node> mp;
map<int, Node>::iterator it;
vector<Node> vec;
bool cmp(Node a, Node b) {
if(a.cnt != b.cnt)
return a.cnt > b.cnt;
return a.len < b.len;
}
int n;
int main() {
//freopen("in.txt", "r", stdin);
while(scanf("%d", &n) != EOF) {
mp.clear();
vec.clear();
int val;
for(int i = 1; i <= n; i++) {
scanf("%d", &val);
if(!mp.count(val)) {
mp[val] = Node(i, i, 1, 1);
}else {
Node& node = mp[val];
node.end = i;
node.len = node.end - node.st + 1;
node.cnt++;
}
}
for(it = mp.begin(); it != mp.end(); it++) {
vec.push_back(it->second);
}
sort(vec.begin(), vec.end(), cmp);
printf("%d %d\n", vec[0].st, vec[0].end);
}
return 0;
}
本文介绍了一个寻找具有最高美丽值的最短连续子数组的问题解决方法。通过使用哈希表记录数组中各元素出现的次数,并结合结构体和排序技巧,实现了高效地找到目标子数组的起始和结束位置。
175

被折叠的 条评论
为什么被折叠?



