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

2021-10-13 19:30:06 字數 1650 閱讀 9855

題目描述:

給你乙個陣列 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:

(1)將原題轉成求最長上公升子串行的問題;

(2)根據目標陣列target,生成新的陣列nums,生成的方式是將arr中的元素,若也存在於target,則將該元素在target陣列中的索引位置順序壓入nums中,則在nums中各個元素的大小關係,就是對應的arr中的元素在target中的相對位置關係;

(3)則在陣列nums找最大上公升子串行,就是找target中的元素在arr中可以組成的最長的子串行關係,則對應的缺少的數量就是target的長度減去最長上公升子串行的長度;

class

solution

vector<

int>nums;

nums.

reserve

(arr.

size()

);for(

int&a:arr)}if

(nums.

empty()

)//求nums中的最長上公升子串行

//先使用了動態規劃的方法,但超時了

//使用二分方法,tail[i]表示 表示長度為 i + 1 的所有上公升子串行的結尾的最小值

vector<

int> tail;

tail.

push_back

(nums[0]

);//初始化

for(

int i=

1;isize()

;++i)

else

else

} tail[right]

=nums[i];}

}//返回相差的長度

return target.

size()

-tail.

size()

;}};

算得到1需要的最少操作次數

實現乙個函式,對乙個正整數n,算得到1需要的最少操作次數。操作規則為 如果n為偶數,將其除以2 如果n為奇數,可以加1或減1 一直處理下去。例子 func 7 4,可以證明最少需要4次運算 n 7 n 1 6 n 2 3 n 1 2 n 2 1 要求 實現函式 實現盡可能高效 int func un...

最長非上公升子串行 刪除最少的元素

其實就是最長上公升子串行的一種變相,要求最長非上公升子串行,其實就是把大小順序換一下,替換是去替換子串行中那個第乙個比你小的數。分兩次,從頭和從尾開始,dp i 表示到達i的子串行長度。加起來 1就是兩個序列到i的長度和。include includeusing namespace std int ...

對乙個正整數n,算得到1需要的最少操作次數

實現乙個函式,對乙個正整數n,算得到1需要的最少操作次數。操作規則為 如果n為偶數,將其除以2 如果n為奇數,可以加1或減1 一直處理下去。例子 func 7 4,可以證明最少需要4次運算 n 7 n 1 6 n 2 3 n 1 2 n 2 1 要求 實現函式 實現盡可能高效 int func un...