繁体   English   中英

算法可以到达的最远建筑物 - JavaScript

[英]Furthest Building You Can Reach Algorithm - JavaScript

我正在尝试用 JavaScript 为下面的问题创建一个解决方案。

给你一个整数数组高度,代表建筑物、一些砖块和一些梯子的高度。

您从建筑物 0 开始您的旅程,并可能使用砖块或梯子移动到下一建筑物。

从第 i 栋建筑移动到第 i+1 栋建筑(0 索引)时,

如果当前建筑物的高度大于或等于下一建筑物的高度,则不需要梯子或砖块。 如果当前建筑物的高度小于下一建筑物的高度,则可以使用梯子或 (h[i+1] - h[i]) 砖。 如果您以最佳方式使用给定的梯子和砖块,则返回您可以达到的最远建筑物索引(0 索引)。

Input: heights = [4,2,7,6,9,14,12], bricks = 5, ladders = 1
Output: 4
Explanation: Starting at building 0, you can follow these steps:
- Go to building 1 without using ladders nor bricks since 4 >= 2.
- Go to building 2 using 5 bricks. You must use either bricks or ladders because 2 < 7.
- Go to building 3 without using ladders nor bricks since 7 >= 6.
- Go to building 4 using your only ladder. You must use either bricks or ladders because 6 < 9.
It is impossible to go beyond building 4 because you do not have any more bricks or ladders.

我天真的解决方案:

var furthestBuilding = function(heights, bricks, ladders) {
    let pos = 0;
    
    while(pos < heights.length) {
        if(pos === heights.length - 1)  break;
        if(heights[pos+1] > heights[pos]) {
            const distance = heights[pos+1] - heights[pos];
            if(distance <= bricks)  bricks -= distance;
            else if(ladders > 0)    ladders--;
            else    break;
        }
        pos++;
    }
    
    return pos;
};

它确实返回了上面示例的预期结果。 但是,下面的输入失败了。

heights = [1,5,1,2,3,4,10000]
bricks = 4
ladders = 1

我的输出是3 ,但解决方案应该是5

递归解决方案崩溃的输入。

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

方法是先用所有梯子,先用最小的梯子替换梯子,以节省砖块。

 /** * @param {number[]} heights * @param {number} bricks * @param {number} ladders * @return {number} */ var furthestBuilding = function (heights, bricks = 0, ladders = 0) { function insert(array, value) { // part for searching the index, taken from // https://stackoverflow.com/a/21822316/1447675 var low = 0, high = array.length; while (low < high) { const mid = (low + high) >>> 1; if (array[mid] < value) low = mid + 1; else high = mid; } array.splice(low, 0, value); } const ladderSizes = []; for (let i = 0, l = heights.length - 1; i < l; i++) { const delta = heights[i + 1] - heights[i]; if (delta <= 0) continue; if (ladders) { insert(ladderSizes, delta); ladders--; continue; } const small = ladderSizes[0]; if (small <= delta && bricks >= small) { bricks -= ladderSizes.shift(); insert(ladderSizes, delta); continue; } if (bricks >= delta) { bricks -= delta; continue; } return i; } return heights.length - 1; }; console.log(furthestBuilding([4, 2, 7, 6, 9, 14, 12], 5, 1)); console.log(furthestBuilding([1, 5, 1, 2, 3, 4, 10000], 4, 1));

假设“上升”是我们列表中的第一个高度或大于前一个高度的高度,并且上升的幅度是增量。

使用 min_heap 表示通过梯子上升。 跟踪砖_左和梯子_左,初始化为您的输入。

我们将在解析高度数组时保持以下内容。 梯子将用于我们所见过的最陡峭的攀登,而砖块将用于所有其他攀登。

即,只要ladders_left > 0,我们就向min_heap 添加新的上升,并从ladders_left 中减去一个。

如果ladder_left = 0,我们将上升与最小堆的顶部进行比较。 如果两者中较小的一个 <=bricks_left 我们可以继续,否则我们就完成了。

假设我们可以继续:

  1. 如果两者中较小的一个是新的上升,从bricks_left 中减去它并继续。
  2. 如果两者中较小的一个是 min_heap 的顶部,则将其移除,将新的 ascent 添加到 min_heap,并从bricks_left 中减去 min_heap 的前一个顶部。

-- 编辑 -- 上面的算法是 O(log(ladders) * (ascents -阶梯))。 如果我们从不是很多梯子开始并且由于某种原因不喜欢 min_heap 的复杂性,我们可以通过用数组替换 min_heap 并通过需要时扫描数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM