題目描述:
給你乙個陣列 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...