日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

leetcode 贪心_LeetCode进阶1029-贪心

發(fā)布時(shí)間:2025/4/16 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 leetcode 贪心_LeetCode进阶1029-贪心 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

閑聊

不知不覺,從開始發(fā)算法博客到如今已經(jīng)過了半月,在這個(gè)過程中其實(shí)也遇到過很多困難,也一度想過要放棄,深刻體會(huì)到?jīng)]有任何一件事情是可以簡(jiǎn)簡(jiǎn)單單敷衍過去的,特別能體會(huì)那些工作之余還能十年如一日?qǐng)?jiān)持技術(shù)文章創(chuàng)作的作者們的不容易。不過盡管辛苦也有很多收獲,比如精益求精,更追求更完美,又比如收獲了很多技術(shù)以外的知識(shí),認(rèn)識(shí)了更多的朋友,視野也更加開闊。猶記得第一次投稿成功,第一次文章被大的專欄收錄,第一次有人點(diǎn)贊,第一次有粉絲關(guān)注,甚至第一次某平臺(tái)粉絲破百的時(shí)候內(nèi)心的喜悅...

未來,希望自己能把算法博客當(dāng)成愛好一直寫下去,也希望能這些文章能給有需要的朋友帶來實(shí)際的幫助。在后續(xù)博文推送過程中,不排除也有些疏漏或者思維理解上的誤區(qū),歡迎交流或批評(píng)指正。

概要

上一篇博客《LeetCode進(jìn)階944-貪心》,有朋友提出建議944對(duì)理解貪心算法并不具有很強(qiáng)的代表性?;仡櫫讼律掀膬?nèi)容,實(shí)際文中博主重點(diǎn)說明的是算法優(yōu)化的小技巧,題解思路也僅僅只是簡(jiǎn)單的統(tǒng)計(jì)法,對(duì)貪心思想實(shí)際幫助確實(shí)不大?;诖瞬┲饕褜⑸掀┛蜆?biāo)題更正為《LeetCode進(jìn)階944-算法優(yōu)化》(除訂閱號(hào)由于微信公眾平臺(tái)的限制,標(biāo)題暫時(shí)無法修改),而本篇將以leetcode1029為實(shí)例,講解貪心算法思想。

原題

1029. Two City Scheduling

There are 2N people a company is planning to interview. The cost of flying the i-th person to city A is costs[i][0], and the cost of flying the i-th person to city B is costs[i][1].

Return the minimum cost to fly every person to a city such that exactly N people arrive in each city.

Example 1:

Input: [[10,20],[30,200],[400,50],[30,20]]

Output: 110

Explanation:

The first person goes to city A for a cost of 10.

The second person goes to city A for a cost of 30.

The third person goes to city B for a cost of 50.

The fourth person goes to city B for a cost of 20.

The total minimum cost is 10 + 30 + 50 + 20 = 110 to have half the people interviewing in each city.

Note:

1 <= costs.length <= 100

It is guaranteed that costs.length is even.

1 <= costs[i][0], costs[i][1] <= 1000

1029. 面試安排(據(jù)題意命名)

公司安排2N個(gè)人參加面試。第i個(gè)人坐飛機(jī)飛到城市A的費(fèi)用為costs[i][0],飛到城市B的費(fèi)用為 costs[i][1]。

返回安排好每個(gè)人都前往某城市面試的最低費(fèi)用,A、B城市各有N個(gè)人參加。

例:

輸入:[[10,20],[30,200],[400,50],[30,20]]

輸出:110

說明:

第一個(gè)人前往 A 市,費(fèi)用為 10。

第二個(gè)人前往 A 市,費(fèi)用為 30。

第三個(gè)人前往 B 市,費(fèi)用為 50。

第四個(gè)人前往B 市,費(fèi)用為 20。

總花費(fèi)最低為 10 + 30 + 50 + 20 = 110,兩個(gè)城市各有一半人在面試。

提示:

1 <= costs.length <= 100

costs.length 為偶數(shù)

1 <= costs[i][0], costs[i][1] <= 1000

  • 本題在LeetCode上屬于貪心算法分類下

題意分析

需要將2N個(gè)人分成兩組,分別送往A、B城市面試,每個(gè)人去A、B城市的費(fèi)用已知,要保證總費(fèi)用最少。凡事涉及最大最小值求和相關(guān)的題型,自然不難聯(lián)想到貪心算法思想,貪心思想最典型的問題是“背包問題”,關(guān)于貪心思想需要注意的是,一定要確?!柏澬摹钡乃悸氛_即能拿到最優(yōu)解,實(shí)踐過程中可以具體進(jìn)行數(shù)值帶入驗(yàn)證。

思路設(shè)計(jì)

根據(jù)題意,需要的最優(yōu)解是花費(fèi)最少的錢分別安排N個(gè)人前往A、B面試,每個(gè)人前往A、B城市的花費(fèi)有個(gè)價(jià)格差。可以這簡(jiǎn)單這么理解我們可以統(tǒng)一計(jì)算出每個(gè)人前往B城市比前往A城市需要多花的錢(也可以是前往A城市比前往B城市要多花的錢),然后進(jìn)行排序,價(jià)格差最大的排名第一的人必然只能安排到A城市,這樣能省下的成本費(fèi)用最大。接著依次往后安排,排第二的人也只能安排到A城市,一直到安排了排第N的人到A城市,剩下的N個(gè)人由于前往B城市比前往A城市花費(fèi)沒那么高全部排到B城市。

偽代碼:

1、新建一個(gè)大小和人數(shù)一致的int數(shù)組sort,用于保存每個(gè)人前往B城市比前往A城市多花費(fèi)的費(fèi)用(注意費(fèi)用可以是負(fù)數(shù),負(fù)數(shù)等價(jià)理解花費(fèi)更少);

2、遍歷costs花費(fèi)數(shù)組,將差值記錄在sort數(shù)組元素中;

i.計(jì)算第i個(gè)人前往B和前往A的差值;

ii.差值左移8位;

iii.左移后加上當(dāng)前在cost數(shù)組中的下標(biāo)位置i;

3、對(duì)差值sort數(shù)組進(jìn)行排序;

4、聲明一個(gè)int變量min表示最小花費(fèi)總和,循環(huán)遍歷sort數(shù)組,遍歷次數(shù)只需人數(shù)的一半costs.length/2;

i.對(duì)于差值排名前N,即sort中最后的N個(gè)人,選擇去A城市的花費(fèi),根據(jù)sort元素存儲(chǔ)的在costs數(shù)組中的下標(biāo)位置從costs數(shù)組中獲取去A城市的花費(fèi);

ii.對(duì)于差值排名后N,即sort中前N個(gè)人,選擇去B城市的花費(fèi),根據(jù)sort元素存儲(chǔ)的在costs數(shù)組中的下標(biāo)位置從costs數(shù)組中獲取去B城市的花費(fèi);

iii.min累加所有總花費(fèi);

編碼實(shí)踐

public int twoCitySchedCost(int[][] costs) {

int sort[] = new int[costs.length];

for (int i = 0; i < costs.length; ++i) {

sort[i] = ((costs[i][1] - costs[i][0]) << 8) + i;

}

Arrays.sort(sort);

int min = 0;

for (int i = 0; i < sort.length / 2; ++i) {

int index1 = sort[costs.length - 1 - i] & 0xFF;

int index2 = sort[i] & 0xFF;

min = min + costs[index1][0] + costs[index2][1];

}

return min;

}

彩蛋

觀察上面實(shí)現(xiàn)代碼會(huì)發(fā)現(xiàn)在sort數(shù)組中存儲(chǔ)前往B和A城市int差價(jià)和在costs數(shù)組中下標(biāo)位置時(shí),使用了左移8位再加i的操作,這便是本文的彩蛋,所有彩蛋均會(huì)在后續(xù)推文中統(tǒng)一說明。

結(jié)語

本文重點(diǎn)在與列舉1029實(shí)例展示對(duì)貪心思想的理解,思路相對(duì)簡(jiǎn)單易于理解,并且從提交結(jié)果可以看出貪心思想算法的實(shí)踐代碼效率已經(jīng)擊敗了99%的算法,故對(duì)另外解法窮舉法便不做詳細(xì)說明,讀者可以考慮自己使用窮舉法進(jìn)行實(shí)現(xiàn)。關(guān)于leetcode進(jìn)階系列博客,后續(xù)也會(huì)疏理出一篇比較系統(tǒng)的進(jìn)階大綱,敬請(qǐng)期待^_^

掃一掃 關(guān)注我的微信訂閱號(hào)

總結(jié)

以上是生活随笔為你收集整理的leetcode 贪心_LeetCode进阶1029-贪心的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。