校招筆試題2019(京東) 合唱隊形

2022-09-13 03:42:08 字數 2111 閱讀 3565

合唱隊的n名學生站成一排且從左到右編號為1到n,其中編號為i的學生身高為hi。現在將這些學生分成若干組(同一組的學生編號連續),並讓每組學生從左到右按身高從低到高進行排序,使得最後所有學生同樣滿足從左到右身高從低到高(中間位置可以等高),那麼最多能將這些學生分成多少組?

輸入

第一行包含乙個整數n,1≤n≤10^5。

第二行包含n個空格隔開的整數h1到hn。1≤hi≤10^9。

輸出

輸出能分成的最多組數。

樣例輸入

42 1 3 2

樣例輸出

2解題思路

首先需要get到的點是:

若要成為乙個組,需要滿足:

1、組內的最小數要大於等於組前面(左邊)所有數(即:最小數大於等於組前面最大數);

2、組內的最大數要小於等於組後面(右邊)所有數(即:最大數小於等於組後面最小數)。

舉個例子:3 1 2 (3 5 4) 6 序列中,(3 5 4)可以成為乙個組,因為組內最小元素是3,其大於等於組前面最大數,即3;並且組內最大數為5,其小於等於組後面的最小數,即6。再舉個反例,1 (3 2 5) 4 6序列中,(3 2 5)中最大的數為5,大於後面的4,所以(3 2 5)不能成為乙個組。

有了以上分析,我們可以確定基本演算法框架:使用貪心演算法,因為需要分成的組最多,所以順序遍歷整個陣列,只要能滿足以上所述兩個判斷條件,即可成為乙個組,並且遍歷完成陣列後,其組的數量是最多的。最初的思路可能需要o(n^2)的時間複雜度(即兩個迴圈),首先是外層迴圈,其依次對陣列中的每個元素進行遍歷,內層迴圈再進行一次遍歷以尋找組前面最大數和組後面最小數。但是這種演算法明顯做了重複的工作:內層迴圈每次遍歷時,均會忘記上次尋找的過程,從第乙個數重新找組外的極值,所以為了降低時間複雜度,提出以下線性時間複雜度演算法。

輪播暫時不能使用,疑似正文中js**被遮蔽,現暫時將放在文末,後期修復此問題!

第一次遍歷尋找某個位置前面的最小數:

開始暫停

第二次遍歷尋找某個位置後面的最大數:

開始暫停

第三次遍歷對佇列進行分組,其中變數代表的意義如下圖(不是**)所示:

以下為演算法分步驟**:

開始暫停

當完成以上步驟後,分組數量可直接通過group_count取回。此題目沒有要求具體的分組策略,若需要具體分組策略,可將int變數group_end改為陣列形式儲存所有的分組情況。

源**

補輪播圖

第一組

第二組

第三組

2019京東校招筆試題 合唱隊形

合唱隊的n名學生站成一排且從左到右編號為1到n nn,其中編號為i的學生身高為h ih i hi 現在將這些學生分為若干組 同一組的學生編號連續 並且讓每組學生從左到右按照身高從低到高排序,使得最後所有學生同樣滿足從左到右身高從低到高 中間位置可以相等 那麼最多能將這些學生分成多少組呢?利用輔助空間...

京東2020校招筆試題 合唱隊分組

合唱隊的n名學生站成一排依次編號為1 n,先要求在編號連續的前提下,將學生按照身高進行分組,要求每組的最矮的同學要比上一組最高的同學要高或者相等。問最大可以分成幾組。輸入 第一行 人數 第二行 每個人的身高 輸出 最大的分組數 如 輸入 2 1 3 2 輸出 解釋 2,1,3,2 2,1 3,2 解...

京東校招筆試題

題目摘自牛客網 給定字串 ascii碼0 255 陣列,請在不開闢額外空間的情況下刪除開始和結尾處的空格,並將中間的多個連續的空格合併成乙個。例如 i am a little boy.變成 i am a little boy 語言不限,但不要用偽 作答,函式輸入輸出請參考如下的函式原型 void f...