赞
踩
题目:小强有一个长度为n的数组a和正整数m。
他想请你帮他计算数组a中有多少个连续的子区间[l,r],其区间内存在某个元素出现的次数不小于m次?
例如数组a=[1,2,1,2,3]且m=2,那么区间[1,3],[1,4],[1,5],[2,4],[2,5]都是满足条件的区间,但区间[3,4]等都是不满组条件的。
今天上午阿里的笔试,60分钟两道题,第一道没做出来,这一道当时时间剩下不多了,加上思路也没有很清晰也没做完(气鼠!),但是本着不放弃的原则还是下午把它做完放到博客上面!果然基础还是不行,咸鱼一条。。。
解题思路:我的思路就是,遍历判断所有的子区间数组,计算符合条件区间个数,要遍历所有子数组不难,难的是判断子区间。其实这里就可以分为两个需要解决的问题:一是遍历找出所有连续的子区间;二是判断当前的子区间是否符合条件。
问题一比较好解决,但是有一点需要注意,就是子区间的长度要大于等于m! 因为条件:是区间内存在某个元素出现的次数不小于m次。也就是说符合条件的区间中至少有一个元素出现的次数至少为m,因此区间长度小于m的就不用考虑了,一定是不符合条件的,这样就可以避免计算全部的子区间,节省时间。
问题二就比较麻烦一点,我的分析就是将问题二再分为两点:第一点简单来说其实就是求一个数组中出现次数最多的元素的出现次数;第二点就是判断出现最多次元素的次数是否大于等于m。 而要求解第一点其实方法很多,我看了下用java的大都是用的哈希表,而c++中的关联容器map就挺适合的,它是用的键-值方式来存储数据,因此可以将区间的元素作为map中的键key,对应的值value就是它出现的次数。遍历完当前区间的元素后,就能获得每个元素出现的次数,因此利用map上面的两点其实也可以分为:第一点是求一个数组中每个元素出现的次数;第二点就是判断数组中是否有元素出现的次数大于等于m! 这样比求出现次数最多的元素的次数,再进行判断又要简便一点!
我的思路就是这样,可惜当时笔试的时候头脑没有这么清晰,而且对c++中的map用的很少,不是很熟练,所以当时没有做出了呜呜呜!下面放上我的代码,大部分代码都注释了的,然后针对一些关键部分再进行解释!
#include<iostream>
#include<vector>
#include<map>
using namespace std;
//判断数组的子区间[l,r]是否符合要求
bool TimesOfSameNum(vector<int> array, int l, int r, int m)
{
map<int, int> maps;//第一个是key,记录子区间的元素;第二个是valueÿ
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。