美團點評2023年校招程式設計題 區間統計

2021-08-27 11:13:48 字數 1916 閱讀 4658

小明拿到乙個數列a1,a2,…an,小明想知道存在多少個區間[l,r]同時滿足下列兩個條件:

r - l + 1 = k;

在al,al+1,…ar中存在乙個數至少出現t次

輸出滿足條件的區間個數。

輸入:

輸入一行三個整數 n,k,t(1<=n,k,t<=10^5).

第二行n個整數,a1,a2,…an(1<=ai<=10^5).

樣例輸入:

5 3 2

3 1 1 1 2

樣例輸出:

hint

區間[1,3]中1出現了2次,區間[2,4]中1出現了3次,區間[3,5]中1出現了2次,使用一共有3個區間滿足條件

其實就是找乙個給定大小區間中某元素出現次數》=t,這個查詢得方法有很多

1.暴力解法,雙重迴圈

2.可以先區間元素排序,之後使用兩個指標,一次遍歷就可以找到結果

3.還可以使用雜湊表,使用stl中的map,分別統計每個數字出現的次數,之後找出最多的數就可以了,只需要兩次遍歷。

方法一:

#include 

#include

using

namespace

std;

int main()

int count=0;

for(int i=0;i1;++i)

if(maxif(max>=t)

++count;

cout

0;}

方法二:

#include 

#include

#include

using

namespace

std;

int getnumberofk(vector

& number)

;int size = number.size();

int left = 0,right = 0;

int max = 0;

while(left int num = number[left];

while(right < size && number[right] == num)++right;

if(right - left>max)

max = right - left;

left = right;

}return max;

}int main()

int count=0;

for(int i=0;i1;++i)

方法三:

#include 

#include

#include

#include

using

namespace

std;

int findmax(vector

& num)

int max=0;

for(auto& time:times)

int main()

int count=0;

for(int i=0;i1;++i)

其中方法一比較容易想到,只是時間複雜度o(n^2),複雜度比較大。

方法二比較麻煩,需要兩個指標,乙個指向相同元素的第乙個數,另外乙個指向相同元素的最後乙個數的後面乙個位置,通過比較兩個指標距離可以得到次數。

方法三如果熟悉map也比較容易,時間複雜度是o(n),實際是2n,使用了乙個輔助空間。

美團2019校招 程式設計

說給了一張包含個n個點n 1條邊的無向連通圖,節點從1到n編號,每條邊長度均為1,設你從1號節點出發並打算遍歷所有節點,那麼總路程至少是多少?輸入 第一行包含乙個整數n,接下來n 1行,每行包括兩個整數x,y表示x與y之間有一條邊 輸出 總路程最小和 樣例 4 1 21 3 3 4輸出 4 incl...

2018美團點評校招 K的倍數

序列中任意個連續的元素組成的子串行被稱為該序列的字串 現在給你乙個序列p和乙個整數k,詢問元素和是k的倍數的子串的最大長度 比如序列,給定的整數k為5,其中滿足條件的子串為 那麼答案就為5,因為最長的子串為 如果滿足條件的子串不存在,就輸出0 輸入 第乙個含乙個整數n,1 n 10 5 第二行包含n...

2018美團點評春招C 試卷程式設計題

美團點評 2018 春招後台開發方向試卷 程式設計題 30.0分1 2 字串距離 時間限制 c c 語言2000ms 其他語言 4000ms 記憶體限制 c c 語言65536kb 其他語言 589824kb 題目描述 給出兩個相同長度的由字元a 和 b 構成的字串,定義它們的距離為對應位置不同的字...