5481 得到目標陣列的最少函式呼叫次數

2021-10-23 16:55:04 字數 2051 閱讀 4889

題目: 5481. 得到目標陣列的最少函式呼叫次數

題目描述:

給你乙個與nums大小相同且初始值全為0的陣列arr,請你呼叫以上函式得到整數陣列nums

請你返回將arr變成nums的最少函式呼叫次數。

答案保證在32位有符號整數以內。

示例 1:

輸入:nums =

[1,5]

輸出:5

解釋:給第二個數加 1 :[0, 0] 變成 [0, 1] (1 次操作)。

將所有數字乘以 2 :[0, 1] ->

[0, 2] ->

[0, 4] (2 次操作)。

給兩個數字都加 1 :[0, 4] ->

[1, 4] ->

[1, 5] (2 次操作)。

總操作次數為:1 + 2 + 2 = 5 。

示例 2:

輸入:nums =

[2,2]

輸出:3

解釋:給兩個數字都加 1 :[0, 0] ->

[0, 1] ->

[1, 1] (2 次操作)。

將所有數字乘以 2 : [1, 1] ->

[2, 2] (1 次操作)。

總操作次數為: 2 + 1 = 3 。

示例 3:

輸入:nums =

[4,2,5]

輸出:6

解釋:(初始)[0,0,0] ->

[1,0,0] ->

[1,0,1] ->

[2,0,2] ->

[2,1,2] ->

[4,2,4] ->

[4,2,5] (nums 陣列)。

示例 4:

輸入:nums =

[3,2,2,4]

輸出:7

示例 5:

輸入:nums =

[2,4,8,16]

輸出:8

1 <= nums.length <= 10^50 <= nums[i] <= 10^9解題思路:

modify 演算法

1)、nums 中單個乙個元素nums[i]+ 1 算一次操作;

2)、nums 中的元素整體nums[i] << = 1, nums 中每乙個元素*2也算作一次操作;

所以可以將arr ----> nums的操作轉換為 對每個數字的二進位制的'0' , '1'的操作;

midmax 記錄的是每個nums[i] 的二進位制的位數 ;

maxnum 記錄 最大的乙個 midmax 的值 ;

ret 是記錄需要的modify 操作的次數;

**實現:

class solution 

maxnum = max(maxnum , midmax);}

cout <

'\t'

<< maxnum << endl ;

return ret + maxnum ;}}

;

演算法複雜度:

時間複雜度:o(n);--- o (n) * 32 (int 最大32位)

空間複雜度:o(1)

算得到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...

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

題目描述 給你乙個陣列 target 包含若干 互不相同 的整數,以及另乙個整數陣列 arr arr 可能 包含重複元素。每一次操作中,你可以在 arr 的任意位置插入任一整數。比方說,如果 arr 1,4,1,2 那麼你可以在中間新增 3 得到 1,4,3,1,2 你可以在陣列最開始或最後面新增整...

劍指Offer之陣列中任意數累加得到目標值

給定乙個陣列arr,和乙個整數aim,如果可以任意選擇arr中的數字,判斷能不能累加得到aim,參考了遞迴版本 public static issum int arr,int i,int sum,int aim return issum arr,i 1,sum,aim issum arr,i 1,s...