貪心演算法例題(一)

2021-10-23 13:25:16 字數 1564 閱讀 5116

貪心演算法-移除k個數字

1、題目描述

給定乙個以字串表示的非負整數 num,移除這個數中的 k 位數字,使得剩下的數字最小。

注意:num 的長度小於 10002 且 ≥ k。

num 不會包含任何前導零。

2、題目分析:

題目簡介明了,就是把給定的數字刪除指定個數的數字使刪除之後的數字是同等位數數字中最小的那個。但是需要注意的是,題目中給的數字是字串的形式並且輸出結果也是字串的形式,這就涉及到字串和數字之間的相互轉化問題。

題目中要求刪除的數字個數是不確定的,那麼我們可以根據數學知識先分析當我們刪除乙個數字的時候應該怎樣刪除才能保證刪除之後的數字是最小的呢?依據下邊的數字1432219為例,當我們要刪除乙個數字的時候,我們需要在左邊(高位)盡可能的刪除較大的數字。最後發現刪除4之後是最小的數字,其實仔細分析就會發現:刪除這乙個數字就是從左邊的高位1開始比較,當發現後乙個數字比前乙個數字小的時候我們就需要把前乙個數字刪除掉,這樣就能保證滿足要求

輸入: num = 「1432219」, k = 3

輸出: 「1219」

解釋: 移除掉三個數字 4, 3, 和 2 形成乙個新的最小的數字 1219。

3、演算法思想:

1、首先把當前給定的字串表示的數字從高位開始逐個分離出來

2、設定乙個棧,用於存放字串分離出來的數字,從高到底逐個壓入棧中。但是這裡涉及到兩個問題:棧是否為空、壓入棧的數字是否是0

3、每分離出來乙個數字,就進行一些判斷:當前待入棧的數字和棧頂元素比較,如果棧頂元素大且k的值要大於0(保證移除指定個數的數字)且棧不為空就要先執行出棧操作然後再把這個待入棧元素入棧。

4、如果不滿足3的情況,依然要考慮站是否為空的情況和待入棧的元素值是否為0的情況,因為當棧為空且待入棧的元素值為0的時候也不能入棧。除了這種情況之後其他情況都是可以入棧的。

5、如果是乙個12345這樣情況的數字,我們發現執行完3和4的情況之後k的值依然是大於0的。那麼當上邊的過程執行完畢我們還要單獨判斷k的值是否大於0,如果大於0的話,就要從棧頂刪除若干個元素是k的值為0.

6、最後取出棧中元素組成字串輸出結果。

**

#include

#include

#include

#include

#include

using

namespace std;

string function

(string str,

int k)

if(num !=0)

}while

(v.size()

!=0&& k >0)

for(

int i=

0;isize()

;++i)

return result;

}int

main()

貪心演算法例題

貪心演算法 greedy 分階段地工作,在每乙個階段都可以認為所做的決定是最好的,而不用考慮後果。這就意味著得到的是區域性最優解決方案,當演算法結束時,如果乙個乙個區域性最優解能組成全域性最優解決,那麼就說明這個演算法是正確的 如果不是,則此演算法的到的結果就是乙個次優解。因此,如果使用貪婪演算法得...

貪心演算法例題

牛牛舉辦了一次程式設計比賽,參加比賽的有3 n個選手,每個選手都有乙個水平值a i.現在要將這些選手進行組隊,一共組成n個隊伍,即每個隊伍3人.牛牛發現隊伍的水平值等於該隊伍隊員中第二高水平值。例如 乙個隊伍三個隊員的水平值分別是3,3,3.那麼隊伍的水平值是3 乙個隊伍三個隊員的水平值分別是3,2...

貪心演算法例題

貪心演算法 移除k個數字 1 題目描述 給定乙個以字串表示的非負整數 num,移除這個數中的 k 位數字,使得剩下的數字最小。注意 num 的長度小於 10002 且 k。num 不會包含任何前導零。2 題目分析 題目簡介明了,就是把給定的數字刪除指定個數的數字使刪除之後的數字是同等位數數字中最小的...