騰訊刷題 逛街

2021-10-04 12:52:10 字數 1669 閱讀 2510

小q在週末的時候和他的小夥伴來到大城市逛街,一條步行街上有很多高樓,共有n座高樓排成一行。

小q從第一棟一直走到了最後一棟,小q從來都沒有見到這麼多的樓,所以他想知道他在每棟樓的位置處能看到多少棟樓呢?(當前面的樓的高度大於等於後面的樓時,後面的樓將被擋住)

輸入描述:

輸入第一行將包含乙個數字n,代表樓的棟數,接下來的一行將包含n個數字wi(1<=i<=n),代表每一棟樓的高度。

1<=n<=100000;

1<=wi<=100000;

輸出描述:

輸出一行,包含空格分割的n個數字vi,分別代表小q在第i棟樓時能看到的樓的數量。

輸入例子1:

6

5 3 8 3 2 5

輸出例子1:

3 3 5 4 4 4

例子說明1:

當小q處於位置3時,他可以向前看到位置2,1處的樓,向後看到位置4,6處的樓,加上第3棟樓,共可看到5棟樓。當小q處於位置4時,他可以向前看到位置3處的樓,向後看到位置5,6處的樓,加上第4棟樓,共可看到4棟樓。

我首先想到的是暴力演算法,因為看到資料量不是很大,兩層迴圈,第一層迴圈下兩個指標,從當前迴圈的元素開始,乙個向前,乙個向後,每個指標都伴隨乙個最大值,當節點大於最大值時,才進入視野並更新最大值,小於等於則省略,但是提交超時了。

第二次想到可用單調棧來實現,設定兩個棧,乙個儲存向前遍歷的節點,乙個儲存向後遍歷的節點,不同於上述暴力演算法,這次乙個從頭出發,乙個從尾出發,例如,當結尾(理論上的結尾)的層數大於中間樓層的層數時,中間樓層是可以的看到的,所以,每次比較遍歷到的元素和棧頂元素,若大於則更新,小於則進入。需要注意的是最後還要加上該樓層本身。

通過**如下:

#include #include #include using namespace std;

#define inf 0x3f3f3f3f

int main()

stackfront, after;

for(int i=n;i>0;i--)

after.push(a[i]);

b[i-1] = after.size();

}cout<=front.top())

front.push(a[i]);

b[i+1] += front.size()+1;

}for(int i=2;i<=n;i++)

return 0;

}

暴力超時**如下:

#include #include #include //6

//5 3 8 3 2 5

//3 3 5 4 4 4

using namespace std;

#define inf 0x3f3f3f3f

int main()

int b[100001];

for(i=1;i<=n;i++)

int num_front, num_after;

for(i=1;i<=n;i++)

else}}

int k = i + 1;

if(k<=n)

else}}

}for(i=1;i<=n;i++)

return 0;

}

程式設計題 逛街

時間限制 c c 2秒,其他語言4秒 空間限制 c c 256m,其他語言512m 小q在週末的時候和他的小夥伴來到大城市逛街,一條步行街上有很多高樓,共有n座高樓排成一行。小q從第一棟一直走到了最後一棟,小q從來都沒有見到這麼多的樓,所以他想知道他在每棟樓的位置處能看到多少棟樓呢?當前面的樓的高度...

騰訊刷題 假期

由於業績優秀,公司給小q放了 n 天的假,身為工作狂的小q打算在在假期中工作 鍛鍊或者休息。他有個奇怪的習慣 不會連續兩天工作或鍛鍊。只有當公司營業時,小q才能去工作,只有當健身房營業時,小q才能去健身,小q一天只能幹一件事。給出假期中公司,健身房的營業情況,求小q最少需要休息幾天。輸入描述 第一行...

騰訊50題刷題一 leetcode155

解法二design a stack that supports push,pop,top,and retrieving the minimum element in constant time.push x push element x onto stack.pop removes the elem...