題目: 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^5
0 <= 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...