持續更新
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 ...