題目: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 暴力...