本文涉及知識點
反悔貪心 反悔堆
LeetCode1642. 可以到達的最遠建筑
給你一個整數數組 heights ,表示建筑物的高度。另有一些磚塊 bricks 和梯子 ladders 。
你從建筑物 0 開始旅程,不斷向后面的建筑物移動,期間可能會用到磚塊或梯子。
當從建筑物 i 移動到建筑物 i+1(下標 從 0 開始 )時:
如果當前建筑物的高度 大于或等于 下一建筑物的高度,則不需要梯子或磚塊
如果當前建筑的高度 小于 下一個建筑的高度,您可以使用 一架梯子 或 (h[i+1] - h[i]) 個磚塊
如果以最佳方式使用給定的梯子和磚塊,返回你可以到達的最遠建筑物的下標(下標 從 0 開始 )。
示例 1:
輸入:heights = [4,2,7,6,9,14,12], bricks = 5, ladders = 1
輸出:4
解釋:從建筑物 0 出發,你可以按此方案完成旅程:
- 不使用磚塊或梯子到達建筑物 1 ,因為 4 >= 2
- 使用 5 個磚塊到達建筑物 2 。你必須使用磚塊或梯子,因為 2 < 7
- 不使用磚塊或梯子到達建筑物 3 ,因為 7 >= 6
- 使用唯一的梯子到達建筑物 4 。你必須使用磚塊或梯子,因為 6 < 9
無法越過建筑物 4 ,因為沒有更多磚塊或梯子。
示例 2:
輸入:heights = [4,12,2,7,3,18,20,3,19], bricks = 10, ladders = 2
輸出:7
示例 3:
輸入:heights = [14,3,19,3], bricks = 17, ladders = 0
輸出:3
提示:
1 <= heights.length <= 105
1 <= heights[i] <= 106
0 <= bricks <= 109
0 <= ladders <= heights.length
反悔貪心(優先梯子)
小根堆heap記錄所有梯子代替的磚塊數,任何位置都嘗試用梯子。梯子不夠,即heap.size() 大于 梯子數時,將代替磚塊最少的梯子換成磚塊。
空間復雜度: O( ladders)
時間復雜度:O(logladders n) n = heights.length
思路
假定有i處需要梯子或磚塊。
{ 全部用梯子 l a d d e r s > = i 需要磚塊最多的 l a d d e r s 處,用梯子,其它用磚 o t h e r \begin{cases} 全部用梯子 &&ladders >= i \\ 需要磚塊最多的ladders處,用梯子,其它用磚 &&other \\ \end{cases} {全部用梯子需要磚塊最多的ladders處,用梯子,其它用磚??ladders>=iother?
前ladders除,全部用梯子。后面的某處需要x塊磚。
{ 棧頂元素右梯子改為磚 反悔 h e a d . t o p ( ) < x x 用磚 o t h e r \begin{cases} 棧頂元素右梯子改為磚 && 反悔 && head.top() < x \\ x用磚 && &&other \\ \end{cases} {棧頂元素右梯子改為磚x用磚??反悔??head.top()<xother?
代碼
核心代碼
class Solution {
public:int furthestBuilding(vector<int>& heights, int bricks, int ladders) {priority_queue<int, vector<int>, greater<>> heap;for (int i = 0; i + 1 < heights.size(); i++) {const int need = heights[i + 1] - heights[i];if (need <= 0) { continue; }heap.emplace(need);if (heap.size() > ladders) {bricks -= heap.top();heap.pop();if (bricks < 0) { return i; }}}return heights.size() - 1;}
};
單元測試
template<class T1, class T2>
void AssertEx(const T1& t1, const T2& t2)
{Assert::AreEqual(t1, t2);
}template<class T>
void AssertEx(const vector<T>& v1, const vector<T>& v2)
{Assert::AreEqual(v1.size(), v2.size());for (int i = 0; i < v1.size(); i++){Assert::AreEqual(v1[i], v2[i]);}
}template<class T>
void AssertV2(vector<vector<T>> vv1, vector<vector<T>> vv2)
{sort(vv1.begin(), vv1.end());sort(vv2.begin(), vv2.end());Assert::AreEqual(vv1.size(), vv2.size());for (int i = 0; i < vv1.size(); i++){AssertEx(vv1[i], vv2[i]);}
}namespace UnitTest
{ vector<int> heights;int bricks, ladders;TEST_CLASS(UnitTest){public:TEST_METHOD(TestMethod00){heights = { 4,2,7,6,9,14,12 }, bricks = 5, ladders = 1;auto res = Solution().furthestBuilding(heights, bricks, ladders);AssertEx(4, res);}TEST_METHOD(TestMethod01){heights = { 4,12,2,7,3,18,20,3,19 }, bricks = 10, ladders = 2;auto res = Solution().furthestBuilding(heights, bricks, ladders);AssertEx(7, res);}TEST_METHOD(TestMethod02){heights = { 14,3,19,3 }, bricks = 17, ladders = 0;auto res = Solution().furthestBuilding(heights, bricks, ladders);AssertEx(3, res);}TEST_METHOD(TestMethod03){heights = { 253710,459585,71981,223232,977918,148680,123527,250812,260416,554767,473621,88538,966794,644116,865416,590993,550004,374573,105036,568303,460987,24602,757598,519047,263800,315868,963895,266638,598245,713310,489802,364169,742274,973483,807739,253747,564636,472387,598445,675408,626061,527760,922748,244691,41163,108095,953208,54400,191957,182321,801110,526756,11220,560896,782344,565351,570890,931781,511665,108738,357367,853555,674526,388790,686349,554731,102668,335287,461231,496065,489980,525209,693696,140598,784402,564477,743153,156379,370768,94810,121932,338323,972441,553422,865236,627884,673412,16147,858309,802780,150410,657225,761430,916149,644587,364929,661236,207648,507409,209803,663553,296241,51843,758342,448408,310536,733500,390516,580506,313748,729366,961156,766804,752158,713426,946971,433800,611365,806559,950149,831368,871881,132092,644626,150762,487527,365094,316637,684249,740162,605893,272845,416251,905202,984909,602362,424697,686193,566240,159584,600277,767037,211677,441897,586509,965864,393340,497044,881539,145921,159055,866123,603476,657682,284714,85306,470415,534245,641462,472616,159434,421500,843442,634366,625668,444943,657933,129173,914540,215272,598415,457087,437568,490742,172811,212016,435680,599042,789308,279873,689943,369130,618428,524390,877649,118759,60586,37618,20797,492854,946585,583767,944693,62988,358292,708659,23496,966718,557539,131703,358231,215464,771609,375770,855917,147866,543477,786910,760512,468183,542081,373398,979543,126508,361409,842847,872593,746682,893518,457222,978730,161753,697245,205997,363180,807952,795175,808090,462585,658667,186220,858457,923762,700792,294201,584816,514737,261038,327627,205592,221896,444108,979369,129394,44001,790354,353917,72772,330118,360651,635275,849492,966042,843108,158554,406317,995111,147752,121006,486157,678653,217657,4288,573547,820817,164534,921608,308037,373838,385901,343399,813472,58859,346176,68090,539503,322652,958331,832724,585003,75794,228299,31211,302603,601041,362034,300803,347024,650585,172193,876895,603734,165956,796982,786231,738823,562729,158032,364908,988395,775023,671485,424571,572157,623273,772919,914302,661979,920229,614760,934156,511607,889533,382154,82654,973121,549095,639792,412821,305216,74071,571794,969979,932469,335153,898442,938912,729489,872970,874332,8390,345366,901364,245104,315592,895028,533836,427909,737421,161915,510434,768573,179267,237370,562023,650593,869876,544314,464374,701215,789191,746271,871247,385836,788092,890101,286938,367130,635751,295576,607054,913206,556383,512305,253121,461980,951444,192012,897432,140517,842228,924286,268918,765459,344159,347853,592899,247814,379693,421908,295638,672994,774285,78096,886320,998456,10915,581642,549650,905526,186991,586693,320053,829130,465779,191060,238711,415584,273709,35854,55818,305798,667280,334370,121051,665390,230729,51662,904228,971349,7088,567705,265941,380847,760602,280222,351148,518112,609328,381795,46766,301829,886537,338310,130937,813816,446885,126867,578861,996302,56516,316900,648733,457604,903338,974707,336231,878687,776626,583241,353383,591761,438716,892530,231901,959454,915103,50735,453313,519651,940657,68380,38339,339705,19207,844122,483005,582959,592635,870233,208322,862826,598864,989646,583679,219396,371194,111781,493739,313465,383867,545219,171577,761747,992356,973874,497603,976481,136374,138311,918066,787696,929197,589326,801358,944697,28038,211029,752621,210197,491050,939207,254024,145811,767376,922553,796100,15858,899164,950319,728378,563113,532136,705190,290216,359946,214594,327241,641000,385347,786200,700340,576438,227606,498337,451637,425192,286305,472053,335562,587556,683468,290205,997253,868480,320419,392391,128015,674737,410783,136490,46713,154232,574917,904387,99900,490640,268209,994867,135705,390652,412028,404195,490553,184029,624391,836288,619242,570500,367786,908994,934572,226481,281181,469810,376226,354931,55711,43299,487568,853741,556475,842100,133451,371270,820314,735709,859169,992745,981261,506744,573542,544798,335063,71332,345306,551165,522500,148531,323820,525891,571989,109699,540927,391815,383139,528328,941384,577084,148432,537377,589708,613443,589827,688798,501198,304829,719726,181892,891384,237429,447803,49953,555945,69576,765896,194628,866362,533750,798399,369884,258270,964160,796047,420697,486470,781692,825420,689886,392317,278581,151823,184594,295461,723312,604322,248126,43623,91154,600821,55136,709242,990838,263827,564093,735641,174057,932157,750399,807534,338221,830644,171022,156968,351523,814982,403402,975555,955973,400091,523040,382185,577810,257717,544345,243199,509472,450948,839442,387377,553239,145202,822954,478559,487143,514465,587609,575770,547307,386320,410846,81519,599793,874316,730403,913822,800625,96868,913119,843783,699,767204,432828,496436,348230,767865,455134,266270,324004,863226,758456,66451,431182,641607,514915,522399,164590,335706,829719,724524,981933,812770,192582,880771,71867,704720,691726,761694,868674,964177,287148,124076,155241,535262,856554,108951,453851,597675,592745,32413,774791,750298,66826,876820,567338,699491,336474,60148,776819,430070,546456,564666,776689,886534,68830,749993,157504,933346,39836,417088,481438,30183,515310,764031,876787,321614,765291,466180,941767,877507,658149,60699,413225,849839,376668,689777,491763,712459,5768,608757,161358,554199,132368,464770,89566,309794,430979,979239,62376,354441,582188,947427,569030,430121,826059,562654,461350,901008,191328,484599,615686,859104,366550,140695,229053,282037,289028,296120,883539,980557,365526,143257,658629,730361,683520,101817,442395,50455,199765,137552,653983,47041,102020,308470,523274,447051,345263,967056,525031,506873,170405,995568,977216,83193,279492,376521,946443,847471,845107,321145,866307,523882,135730,824806,927733,605908,580895,177233,443804,914175,905847,661407,483093,518439,789231,66585,447439,14824,861841,89137,913636,194682,166773,212398,259259,160638,435374,941416,140851,311224,54813,155003,595354,742575,668942,77310,96783,217826,211522,116834,391751,922905,730508,225636,265187,995541,329461,244649,951125,322487,140958,608238,511144,410963,335698,228967,487748,382037,261094,363854,557078,539851,519352,364988,444038,284404,730251,828294,608545,188095,466810,46659,673970,142329,93794,167913,30119,116528,592075,810599,14144,445947,51745,236481,878706,838520,310352,112640,612690,663852,546444,818881,868195,573845,390221,254379 }, bricks = 33671263, ladders = 108;auto res = Solution().furthestBuilding(heights, bricks, ladders);AssertEx(589, res);}};
}
反悔貪心(優先磚塊)
大根堆記錄各處使用磚塊的數量,如果磚塊不夠。則將需要最多的磚塊換成梯子。梯子不夠時,就不能再跳了。
class Solution {
public:int furthestBuilding(vector<int>& heights, int bricks, int ladders) {priority_queue<int> heap;for (int i = 0; i + 1 < heights.size(); i++) {const int need = heights[i + 1] - heights[i];if (need <= 0) { continue; }bricks -= need;heap.emplace(need);if (bricks < 0) {bricks += heap.top();heap.pop();ladders--;if (ladders < 0) { return i; }}}return heights.size() - 1;}
};
二分查找
本題也可以用二分查找。
擴展閱讀
視頻課程
先學簡單的課程,請移步CSDN學院,聽白銀講師(也就是鄙人)的講解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成戰斗了,為老板分憂,請學習C#入職培訓、C++入職培訓等課程
https://edu.csdn.net/lecturer/6176
相關推薦
我想對大家說的話 |
---|
《喜缺全書算法冊》以原理、正確性證明、總結為主。 |
按類別查閱鄙人的算法文章,請點擊《算法與數據匯總》。 |
有效學習:明確的目標 及時的反饋 拉伸區(難度合適) 專注 |
聞缺陷則喜(喜缺)是一個美好的愿望,早發現問題,早修改問題,給老板節約錢。 |
子墨子言之:事無終始,無務多業。也就是我們常說的專業的人做專業的事。 |
如果程序是一條龍,那算法就是他的是睛 |
測試環境
操作系統:win7 開發環境: VS2019 C++17
或者 操作系統:win10 開發環境: VS2022 C++17
如無特殊說明,本算法用**C++**實現。