面試高頻leetcode演算法題

2021-10-04 19:05:35 字數 4339 閱讀 7424

持續更新

def

quick_rank

(nums):if

len(nums)

<=1:

return nums

left,right =

,[] mid = nums[0]

for i in nums[1:

]:if i > mid:

else

:return quick_rank(left)

+[mid]

+quick_rank(right)

給定乙個有序陣列 arr 和乙個目標元素 target ,返回該 target 在 arr 中的索引,若不存在,返回-1

def

binary_search

(nums,target)

: left,right =0,

len(nums)-1

while left <= right:

mid =

(left+right)//2

if nums[mid]

== target:

return mid

if nums[mid]

< target:

left = mid +

1else

: right = mid -

1return

-1

有乙個樓梯,總共有10級台階,每次只能走一級或者兩級台階,全部走完,有多少種走法

def

pa_stairs

(n):

if n ==1:

return

1if n ==2:

return

2 a,b =1,

2for _ in

range(2

,n):

a,b = b,a+b

return b

尋找列表中滿足兩數之和等於目標值的元素的下標。例如:arr = [2,7,4,9],target = 6 則返回 [0,2],若不存在,返回空列表

def

sum_of_two

(nums,target)

: dic =

for i in

range

(len

(nums)):

cur = target - nums[i]

if cur in dic.keys():

return

[dic[cur]

,i]else

: dic[nums[i]

]= i

return

有乙個陣列,x的索引小於y的索引,使得 x-y 最大, 求最大回撤值。例如 arr = [3,7,2,6,4,1,9,8,5], 最大回撤是6

def

max_drawdown

(nums):if

len(nums)==1

:return nums[-1

] re =

float

('-inf'

) min_x = nums[-1

]for i in

range

(len

(nums)-2

,-1,

-1):

min_x =

min(nums[i]

,min_x)

re =

max(nums[i]

-min_x,re)

return re

給定兩個按公升序排列的有序陣列,將它們合併成乙個新的有序陣列。例如:a = [1,2,6,8], b = [2,4,7,10],輸出為 arr = [1,2,2,4,6,7,8,10]

def

merge_sorted_array

(a,b)

: re =

while a and b:

if a[0]

> b[0]

:0))

else:0

))if a:

re.extend(a)

else

: re.extend(b)

return re

給定乙個陣列,求其最大連續子陣列的和。例如:arr = [1,5,-10,2,5,-3,2,6,-3,1]. 輸出為:12。對應的連續子陣列為 [2,5,-3,2,6]

def

max_sub

(nums)

: n =

len(nums)

if n ==1:

return nums[0]

dp,re = nums[0]

,nums[0]

for i in

range(1

,len

(nums)):

dp =

max(nums[i]

,dp+nums[i]

) re =

max(re,dp)

return re

給定乙個字串,找出沒有重複字元的最長的子串。例如輸入「abcbefgf」,答案是 「cbefg」

def

longest_substr

(s):

n =len(s)

if n ==1:

return s

left,right =0,

1 memo =

set(s[0]

) re = s[0]

while left <= right and right < n:

if s[right]

notin memo:

memo.add(s[right]

) right +=

1 cur = s[left:right]

iflen

(cur)

>

len(re)

: re = cur

else

: memo.remove(s[left]

) left +=

1return re

給定乙個陣列,找出其所有可能的排列。例如: arr = [1,1,3],輸出為 [[1,1,3],[1,3,1],[3,1,1]]

def

permutations

(nums)

: re =

n =len(nums)

if n ==1:

return

[nums]

defhelper

(nums,temp):if

not nums:

if temp not

in re:

return

for i in

range

(len

(nums)):

helper(nums[

:i]+nums[i+1:

],temp +

[nums[i]])

helper(nums,

)return re

給定乙個陣列和目標數target,找出陣列中a,b,c滿足 a+b+c = target 的所有組合。例如:arr = [-3,-1,-2,1,2,3],target = 0。輸出為 [(-3,1,2),(-2,-1,3)]。時間複雜度要求為o(n**2) ,空間複雜度要求o(1)

def

sum_of_three

(nums,target)

: nums =

sorted

(nums)

n =len(nums)

re =

for k,v in

enumerate

(nums)

: i,j = k+

1,n-

1while iif v+nums[i]

+nums[j]

< target:

i +=

1elif v+nums[i]

+nums[j]

> target:

j -=

1else

:(v,nums[i]

,nums[j]))

i,j = i+

1,j-

1return re

排序演算法相關的筆試面試高頻題

1.荷蘭國旗問題。只包含0,1,2的整數陣列進行排序,要求使用交換 原地排序,不是利用計數進行排序。原地排序就是指不申請多餘的空間來進行的排序,就是在原來的排序資料中比較和交換的排序。例如 堆排序等都是原地排序,合併排序 根據taocp,合併排序也有原地排序的版本 計數排序 等不是原地排序。屬於原地...

LeetCode高頻題 鍊錶(一)

我開了乙個leetcode會員,選擇了一些高頻率題目。這個系列是希望幫助大家每天花30分鐘的題目了解面試高頻題,讓大家面試更加游刃有餘。本期我們開始講解鍊錶的題目,先介紹幾道簡單題熱熱身。本期所用的鍊錶的資料結構均如下 public class listnode 題意 刪除鍊錶中等於給定值 val ...

LeetCode高頻題 鍊錶(四)

我們講解的題目都是leetcode上經典的題目,而且我們的解答一定也是最簡單最經典的。今天帶來兩道關於鍊錶的經典題。本期所用的鍊錶的資料結構均如下 public class listnode 題意 給定乙個單鏈表 l l0 l1 ln 1 ln 將其重新排列後變為 l0 ln l1 ln 1 l2 ...