分析: 這道題我是用的動態規劃來求解,和傳統的上樓梯問題不同,它多了乙個不能連續走兩步的條件,但我認為沒什麼不同。根據題意,最後一步要麼是2要麼是1,如果最後一步是2,則要考慮不能連續走兩步的限制情況。也就是說,對於乙個已經走到n-2步的人來說,他只能由n-3步走1步得到,而不能由n-4步走兩步得到.
即走上n步樓梯要麼是xx…xx1要麼是xx…xx12,除此之外沒有其他情況。所以動態規劃的方程為dp[i]=dp[i-1]+dp[i-3],但是我根據這個方程最後的通過率只有50%,希望誰能為我解答一下,是不是哪兒出了問題。分析:這道題的大意就是對於陣列中的乙個數,找到左右兩邊分別比他大的第乙個數。
可以用乙個lindex儲存左邊第乙個比該數大的數的下標,rindex儲存右邊的,這道題在我看來肯定是要遍歷整個陣列的,我的處理方法是,先從左至右遍歷一遍,對於數num[i]來說,如果num[i]<=num-1,則lindex=num-1,否則lindex就從上一次迴圈的lindex繼續遍歷知道下標為零(因為num[i]>num[i-1],所以num[i]的lindex更偏左或者為0),從右至左遍歷同樣。`
#include
#include
using
namespace std;
intmain()
for(
int i=
2; i)else}}
if(flag)res[i]
=lindex;
else res[i]=0
;}for(
int i=n-
1;i>=
2;i--
)else}}
if(flag) res[i]
=res[i]
*rindex;
else res[i]=0
;}for(
int i=
2;i<=n-
1;i++
)
cout<}
後記:還是超時了,只過了百分之50多的資料,不知道**還能繼續優化分析:對於原序列可以想到常規的動態規劃dp[i]=max(a[i],d[i-1]+a[i]),其中dp[i]代表以a[i]結尾的最長連續整數和。該題的關鍵在於原序列拓展之後首尾的數變得連續了,所以不妨對於m=2的情況用一次動態規劃,這個時候再中間再加入一段序列,可以想到,如果原序列所有數之和大於0,則結果就在m=2的情況下再加上原系列所有數之和,由此可以類推到m的情況。**就不貼了,畢竟最後的結果也是正好50%,這道題思路有些瑕疵,留待思考之後繼續更新。
未完待續。。。
2019位元組跳動實習面試
位元組跳動還是依舊非常注重演算法能力,所以面試過程演算法比重依舊比較大,不知道是不是年前比較缺人的原因,這次面試一共經歷了兩面,而且難度比我去年面試抖音略簡單一下,下面是面試過程的主要題目。1.開始仍舊是常規的自我介紹,接下來重點詢問我在美團實習的經歷,待我將實習內容講解完成以後,主要問我分庫分表按...
9 6 位元組跳動筆試
大概題意 有個樓梯比較高,問有多少種可以方式可以走上去,但有特殊得要求 一是每次可以走一步或者兩步,二是不能連續的走兩步 計算有多少種方法到達頂層 輸入 樓層的層數 輸出 一共有多少種走法 思路 直接dp就好了,設dp方程為dp i 2 dp i 0 表示走一步之後達到第i層,那麼轉移方程就是dp ...
2 位元組跳動 陣列與排序
1 三數之和 原文 2 島嶼的最大面積 原文 3 搜尋旋轉排序陣列 public int search int nums,int target else 條件2 if nums mid nums right else return 1 參考 4 最長連續遞增序列 參考 5 陣列中的第k個最大元素 p...