今天博主這個小白去面試了一個大公司,這是博主第一次面試 這麼一個上市大公司 ,那給博主緊張的。
進去就被 保安大哥給攔住了,額…扯遠了,迴歸正題. 今天博主面試了這家大公司 面試題就兩道,兩道算法題,算是很簡單的算法題,可是博主太傻X了,用了最傻X的兩層for循環解決問題.導致時間複雜度變成了O(N^2)
還好本博主機制後來想到了補救之道 ,話不多說,放上面試題(PS 對面試題進行了改造,因爲該公司招聘還在進行中,但是 貌似沒什麼必要 反正博主的博客也沒人看 2333):
面試題一考點連續最長子序列
這道題最好的辦法應該:是動態規劃或者是貪心,可是博主當時太緊張了,就用了最2B 的 兩層for循環,被自己的2B打敗了,不知道面試還能不能過了呢
問題描述:給出一個序列a1,a2,a3,a4,a5,a6,a7….an,求它的一個子序列(設爲s1,s2,…sn),使得這個子序列滿足這樣的性質,s1
int LIS(int arr[], int n)
{
for(int i=1; i<=n; ++i)
dp[i] = 0;
int ans;
dp[1] = 1;
for(int i=2; i<=n; ++i)
{
ans = dp[i];
for(int j=1; j<i; ++j)
{
if(arr[i]>arr[j] && dp[j]>ans)
ans = dp[j];
}
dp[i] = ans+1;
}
ans = 0;
for(int i=1; i<=n; ++i)
{
if(dp[i] > ans)
ans = dp[i];
}
return ans;
}
時間複雜度:(NlogN):
除了算法一的定義之外(p【i】相當於算法一中的arr【i】),增加一個數組b,b[i]用以表示長度爲i最長子序列的最後一個數最小可以是多少。易證:i
int bSearch(int num, int k)
{
int low=1, high=k;
while(low<=high)
{
int mid=(low+high)/2;
if(num>=b[mid])
low=mid+1;
else
high=mid-1;
}
return low;
}
int LIS()
{
int low = 1, high = n;
int k = 1;
b[1] = p[1];
for(int i=2; i<=n; ++i)
{
if(p[i]>=b[k])
b[++k] = p[i];
else
{
int pos = bSearch(p[i], k);
b[pos] = p[i];
}
}
return k;
}
面試題二 : 類似於查找插入,判斷一個數應該在一個數組裏的下標 結題步驟跟第一個面試題相似 就不一一列舉 了