LeetCode 1713 最長遞增子串行應用

2021-10-19 10:39:58 字數 1765 閱讀 7719

1713. 得到子串行的最少操作次數

給你乙個陣列 target ,包含若干 互不相同 的整數,以及另乙個整數陣列 arr ,arr 可能 包含重複元素。

每一次操作中,你可以在 arr 的任意位置插入任一整數。比方說,如果 arr = [1,4,1,2] ,那麼你可以在中間新增 3 得到 [1,4,3,1,2] 。你可以在陣列最開始或最後面新增整數。

請你返回 最少 操作次數,使得 target 成為 arr 的乙個子串行。

乙個陣列的 子串行 指的是刪除原陣列的某些元素(可能乙個元素都不刪除),同時不改變其餘元素的相對順序得到的陣列。比方說,[2,7,4] 是 [4,2,3,7,2,1,4] 的子串行(加粗元素),但 [2,4,2] 不是子串行。

示例 1:

輸入:target = [5,1,3], arr = [9,4,2,3,4]

輸出:2

解釋:你可以新增 5 和 1 ,使得 arr 變為 [5,9,4,1,2,3,4] ,target 為 arr 的子串行。

示例 2:

輸入:target = [6,4,8,1,3,2], arr = [4,7,6,2,3,8,6,1]

輸出:3

1 <= target.length, arr.length <= 105

1 <= target[i], arr[i] <= 109

target 不包含任何重複元素。

通過次數1,445提交次數3,140

解析:

ans=len(a)-lcs(a,b),lcs:最長公共子串行

def minoperations1(target, arr):

m, n = len(target), len(arr)

dp = [[0] * (n+1) for _ in range(m+1)]

for i in range(1, m+1):

for j in range(1, n+1):

dp[i][j] = max([dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1] + int(target[i-1] == arr[j-1])])

return len(target) - dp[m][n]

target = [6,4,8,1,3,2], arr = [4,7,6,2,3,8,6,1]

將target 轉換成序號:[0,1,2,3,4,5]

arr相應數字也進行替換:[1,0,5,4,2,0,3],沒有的刪除

由於target序號一定是遞增序列,因此本題可以轉換成尋找-最長單調遞增子串行,參見:300. 最長遞增子串行

複雜度:o(n)

def minoperations2(target, arr):

def lis(a) -> int:

dp =

for x in a:

if not dp or x > dp[-1]:

else:

dp[bisect_left(dp, x)] = x

return len(dp)

map_set =

new_arr = [map_set.get(x) for x in arr if x in map_set]

return len(target) - lis(new_arr)

1713最長同號連續段

最長同號連續段 time limit 1 seconds memory limit 32768 k total submit 447 accepted 179 description 給出乙個由非0整數組成的序列a1,a2,an,設計遞迴演算法求其中由同號整數組成的最長連續段 稱為最長同號連續段 的...

leetcode面試題 17 13 恢復空格

哦,不!你不小心把乙個長篇文章中的空格 標點都刪掉了,並且大寫也弄成了小寫。像句子 i reset the computer.it still didn t boot 已經變成了 iresetthecomputeritstilldidntboot 在處理標點符號和大小寫之前,你得先把它斷成詞語。當然...

Leetcode139 單詞拆分(動態規劃,遞迴)

重點1 判斷字串s是否在list中,即實現類似python中in方法 將list轉為set,然後用set的contains方法 list轉set setset new hashset worddict 實現 1 public boolean check string s,listworddict 解...