面試題 最長連續子串行

2021-10-24 09:39:23 字數 1894 閱讀 4482

題目:

leetcode 128 最長連續子串行

但是有所不同的是,這裡求得不僅僅是長度,同時需要將整個子串行給復原出來,最後返回乙個子串行的陣列。

100, 4, 200, 1, 3, 2 => [1,2,3,4]

第一種方法是利用map的方法,這種方法的話時間複雜度是o(n),因為不需要排序,排序的時間複雜度是o(nlogn),所以時間複雜度上面更加有優勢。

第二種方法是利用排序之後,利用動態規劃來解決這個問題,因為後面可能與前面連續,也可能不連續,此時只需要通過值的判斷就可以知道當前的值是否是有個連續狀態。

map方式

遍歷陣列中所有的數,每次獲取自身左右的數字,然後將自己最左邊和最右邊去更新,因為自己最右邊和最左邊只有當前自己能夠接觸到,如果是自己的下乙個,它可能就觸碰不到了

public

intlongestconsecutive

(int

nums)

if(right !=0)

max = math.

max(sum +

1, max);}

}return max;

}

後面的話只需要找出值最大的最大的鍵值,即可通過連續個數個值大小復原

排序&動態規劃

public

int[

]longestconsecutiveii

(int

nums)

else

if(nums[i]

== nums[i -1]

)}// 找到最大值的下標,然後找到最長序列的最大值即可

int index =0;

for(

int i =

0; i < dp.length; i++)}

int[

] num =

newint

[max]

;int j =0;

// 找出當前的乙個序列

for(

int i = index - max +

1; i <= index; i++

)return num;

}

set方式解決

這個的主要思路就是值從最小的開始溯源,每乙個最短的長度為1,只要存在比自己小的,自己肯定不是連續的裡面最小的乙個,此時直接跳過,直到找到不存在比自己小的元素,此時開始遍歷,遍歷的話只找到比自己大1的,然後遞迴迭代的方式找尋到所有的長度

// o(n) 這個如果最小值是在最後的話,可能的時間複雜度是o(n^2)

public

intlongestconsecutiveiii

(int

nums)

int longest =0;

int current;

for(integer num : set)

} longest = math.

max(longest, longlen);}

return longest;

}

整個的思路在面試的時候只想到了map形式,但是當時只知道去更新左右的兩個,沒想到更新左右個數邊界的值,導致當前的連續最大值沒有能夠得到傳遞,最後的結果就是錯了。這道題之前做過,但是現在面試的時候還是不會做。

keep thinking, keep coding!

動態規劃 面試題 最長上公升子串行

我是覺得這個系列 少了點東西 原來是最長上公升子串行沒寫 題目 輸入 10,9,2,5,3,7,101,18 輸出 4 解釋 最長的上公升子串行是 2,3,7,101 它的長度是 4。動態規劃 四步走起 動態規劃 確定狀態 dp i 代表以nums i 結尾的最大增序列個數 狀態轉移 前提 a i ...

面試題 最長回文子串

在網上找了幾個版本,改編的,好難啊。加油。最大回文子串問題 include includeusing namespace std 返回最長的回文子串 char max substring bxy char str,int length for int i 0 i m i 不預先判斷奇偶,先奇後偶,m...

面試題 最長回文子串

這個也算是很經典的題目了,o n 的解法還是要自己鑽進去想一想的,不能總以為自己會了,動手寫一寫才是王道。題大家應該都知道,我就直接用ppt裡面的了。例如ababcdedcbaab,最長回文子串是abcdedcba。暴力解法1 列舉起點o n 列舉終點o n 判斷回文o n 總複雜度o n 3 暴力...