leetcode1558題解 貪心

2022-02-09 12:16:05 字數 924 閱讀 2368

題目鏈結

貪心時間複雜度o(nlogn)n為陣列中最大的那個數。

1.題意就是給定乙個函式,該函式有兩種功能,一種就是將陣列中的所有數同乘以2,另一種就是將陣列中的某個數加1。給定乙個陣列nums,讓你將初始值全為0的陣列arr通過呼叫給定的函式來變成nums。問最少呼叫次數。

2.剛開始模擬了一番,但因為考慮的方法不對(至於**不對呢,就是一開始我就把陣列的值都加1了一遍,然後再同乘以2,最後再乙個個補1,這麼做顯然不利於減少次數。至於當時為啥這麼想,估計是腦子抽了),最終無果。

3.接下來步入正題,我們可以這麼想。當初始值都為0時,我們可以使部分值首先加1(即最終要變成的較大的值),讓它們首先乘以2,不斷乘,乘到一定程度再處理。但這麼做有個問題,讓哪部分值先變成1呢?還有就是乘到哪種程度呢?

這個地方的確是個難點,不太容易想。如果直接模擬的話不太容易。

陣列中誰乘2的次數最多,當然是目標值最大的那個數乘的次數最多,其他目標值較小的就相對來說乘的次數較少。我們可以貪心地讓那些乘的次數較少的包含在乘的次數最多裡面,至於它具體是怎麼乘的,我們不用考慮太多,這就是貪心演算法的好處。

如何計算每個數最終乘的次數,我們可以分情況討論:

為了方便,我們可以從目標值向初始值變化。

最終,陣列中的值就都變成0了。

4.總之,這道題的基本思路就是求出目標陣列中最大值變成0需要除2的次數,以及該陣列中每個數需要減1的次數(什麼時候減,就是為奇數的時候減),二者相加即為答案。

class solution 

if(nums[i] > 0)

}mx = max(mx, cnt);

}res += mx;

return res;

}};

思路**

codeforces1141D題解 暴力 貪心

給出兩個長度為 n 1 n 150000 的僅含有小寫字母和 的字串,詢問兩個字串最多能有幾對匹配的字元。每個字母都可以與和它相同的字元匹配,可以與任意字元匹配,匹配與位置無關 輸出最大匹配對數,以及每一對中兩個字元在字串中的位置 cf1141d created by hao on 2019 4 1...

leetcode併發題解

解法一 使用volatilepublic class foowithvolatile public void first runnable printfirst throws interruptedexception public void second runnable printsecond t...

Leetcode 題解 排序

桶排序 荷蘭國旗問題 用於求解kth element問題,也就是第 k 個元素的問題。可以使用快速排序的 partition 進行實現。需要先打亂陣列,否則最壞情況下時間複雜度為 o n2 用於求解topk elements問題,也就是 k 個最小元素的問題。使用最小堆來實現 topk 問題,最小堆...