Posted labuladong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了相关的知识,希望对你有一定的参考价值。

瀛︾畻娉曡鍑?nbsp;labuladong

鍚庡彴鍥炲杩涚兢涓€璧峰姏鎵p煒?/span>

璇诲畬鏈枃锛屼綘鍙互鍘诲姏鎵hВ鍐筹細

410.鍒嗗壊鏁扮粍鐨勬渶澶у€硷紙Hard锛?/span>

缁忓父鏈夎鑰呴棶鎴戯紝璇讳簡涔嬪墠鐨勭垎鏂?涔嬪悗锛屼簩鍒嗘煡鎵剧殑绠楁硶浠栧啓鐨勫緢婧滀簡锛屼絾浠呬粎灞€闄愪簬鍦ㄦ暟缁勪腑鎼滅储鍏冪礌锛屼笉鐭ラ亾搴曟€庝箞鍦ㄧ畻娉曢閲岄潰杩愮敤浜屽垎鏌ユ壘鎶€宸ф潵浼樺寲鏁堢巼銆?/p>

閭f垜鍏堣缁撹锛屼綘鎯崇敤浜屽垎鏌ユ壘鎶€宸т紭鍖栫畻娉曪紝棣栧厛瑕佹妸 for 寰幆褰㈠紡鐨勬毚鍔涚畻娉曞啓鍑烘潵锛屽鏋滅畻娉曚腑瀛樺湪濡備笅褰㈠紡鐨?for 寰幆锛?/p>

// func(i) 鏄?nbsp;i 鐨勫崟璋冨嚱鏁帮紙閫掑閫掑噺閮藉彲浠ワ級
int func(int i);

// 褰㈠杩欑 for 寰幆鍙互鐢ㄤ簩鍒嗘煡鎵炬妧宸т紭鍖栨晥鐜?/span>
for (int i = 0; i < n; i++) {
    if (func(i) == target)
        return i;
}

濡傛灉func(i)鍑芥暟鏄湪i涓婂崟璋冪殑鍑芥暟锛屼竴瀹氬彲浠ヤ娇鐢ㄤ簩鍒嗘煡鎵炬妧宸т紭鍖?for 寰幆銆?/p>

銆屽湪i涓婂崟璋冪殑鍑芥暟銆嶆槸鎸?code class="mq-54">func(i)鐨勮繑鍥炲€奸殢鐫€i鐨勫鍔犺€屽鍔狅紝鎴栬€呴殢鐫€i鐨勫鍔犺€屽噺灏忋€?/p>

涓轰粈涔堟弧瓒宠繖涓潯浠跺氨鍙互浣跨敤浜屽垎鏌ユ壘锛?span class="mq-58">鍥犱负杩欎釜閫昏緫鍜屻€屽湪鏈夊簭鏁扮粍涓煡鎵句竴涓厓绱犮€嶆槸瀹屽叏涓€鏍风殑鍛€锛?/p>

鍦?span class="mq-60">鏈夊簭鏁扮粍nums涓煡鎵炬煇涓€涓暟target锛屾槸涓嶆槸鏈€绠€鍗曚簩鍒嗘煡鎵惧舰寮忥紵鎴戜滑鐪嬩笅鏅€氱殑 for 寰幆閬嶅巻绠楁硶锛?/p>

// nums 鏄竴涓湁搴忔暟缁?/span>
int[] nums;
// target 鏄鎼滅储鐨勫厓绱?/span>
int target;

// 鎼滅储 target 鍦?nbsp;nums 涓殑绱㈠紩
for (int i = 0; i < nums.length; i++) {
    if (nums[i] == target)
        return i;
}

鏃㈢劧nums鏄湁搴忔暟缁勶紝浣犳妸nums[i]鐪嬪仛鍑芥暟璋冪敤锛屾槸涓嶆槸鍙互鐞嗚В涓?code class="mq-78">nums鍦ㄥ弬鏁?code class="mq-79">i涓婃槸鍗曡皟鐨勶紵杩欐槸涓嶆槸鍜屼箣鍓嶈鐨?code class="mq-80">func(i)鍑芥暟瀹屽叏涓€鏍凤紵

褰撶劧锛屽墠鏂?璇磋繃锛屼簩鍒嗘煡鎵剧畻娉曡繕鏈夋悳绱㈠乏渚с€佸彸渚ц竟鐣岀殑鍙樹綋锛屾€庝箞杩愮敤鍒板叿浣撶畻娉曢棶棰樹腑鍛紵

杩樻槸娉ㄦ剰瑙傚療 for 寰幆褰㈠紡锛屽彧鏄笉涓€瀹氭槸func(i) == target浣滀负缁堟鏉′欢锛屽彲鑳芥槸<=鎴栬€?code class="mq-85">>=鐨勫叧绯伙紝杩欎釜鍙互鏍规嵁鍏蜂綋鐨勯鐩剰鎬濇潵鎺ㄦ柇锛屾垜浠疄鎿嶄竴涓嬪姏鎵g 410 棰樸€屽垎鍓叉暟缁勭殑鏈€澶у€笺€嶏紝闅惧害 Hard锛?/p>

鍑芥暟绛惧悕濡備笅锛?/p>

int splitArray(int[] nums, int m);

杩欎釜棰樼洰鏈夌偣绫讳技鍓嶆枃涓€閬撶粡鍏稿姩鎬佽鍒掗鐩?锛岄鐩瘮杈冪粫锛屽張鏄渶澶у€煎張鏄渶灏忓€肩殑銆?/p>

绠€鍗曡锛岀粰浣犺緭鍏ヤ竴涓暟缁?code class="mq-100">nums鍜屾暟瀛?code class="mq-101">m锛屼綘瑕佹妸nums鍒嗗壊鎴?code class="mq-103">m涓瓙鏁扮粍銆?/p>

鑲畾鏈変笉姝竴绉嶅垎鍓叉柟娉曪紝姣忕鍒嗗壊鏂规硶閮戒細鎶?code class="mq-105">nums鍒嗘垚m涓瓙鏁扮粍锛岃繖m涓瓙鏁扮粍涓偗瀹氭湁涓€涓拰鏈€澶х殑瀛愭暟缁勫鍚с€?/p>

鎴戜滑鎯宠鎵句竴涓垎鍓叉柟娉曪紝璇ユ柟娉曞垎鍓插嚭鐨勬渶澶у瓙鏁扮粍鍜屾槸鎵€鏈夋柟娉曚腑鏈€澶у瓙鏁扮粍鍜屾渶灏忕殑銆?/p>

璇蜂綘鐨勭畻娉曡繑鍥炶繖涓垎鍓叉柟娉曞搴旂殑鏈€澶у瓙鏁扮粍鍜屻€?/p>

鎴戞淮濡堝憖锛岃繖涓鐩湅浜嗗氨瑙夊緱 Hard锛屽畬鍏ㄦ病鎬濊矾锛岃繖棰樻€庝箞鑳藉拰浜屽垎鏌ユ壘绠楁硶鎵笂鍏崇郴锛?/p>

璇翠釜灏忔彃鏇诧紝蹇墜闈㈣瘯鏈変竴閬撶敾甯堢敾鐢荤殑绠楁硶棰橈紝寰堥毦锛屽氨鏄互杩欓亾棰樹负鍘熷瀷銆傚綋鏃舵垜娌″仛杩囪繖閬撳姏鎵i锛岄潰璇曟湁鐐规嚨锛屼笉杩囦箣鍓嶆枃绔?鍐欎簡涓ら亾绫讳技鐨勬瘮杈冪畝鍗曠殑棰樼洰锛屽鍔犻潰璇曞畼鐨勬彁绀猴紝鎶婇偅閬撻鍋氬嚭鏉ヤ簡銆?/p>

闈㈣瘯鍋氱畻娉曢鐨勬椂鍊欙紝棰樼洰涓€鑸兘浼氳姹傜畻娉曠殑鏃堕棿澶嶆潅搴︼紝濡傛灉浣犲彂鐜?O(NlogN) 杩欐牱瀛樺湪瀵规暟鐨勫鏉傚害锛屼竴鑸兘瑕佸線浜屽垎鏌ユ壘鐨勬柟鍚戜笂闈狅紝杩欎篃绠楁槸涓皬濂楄矾銆?/p>

瑷€褰掓浼狅紝濡備綍瑙e喅杩欓亾鏁扮粍鍒嗗壊鐨勯棶棰橈紵

棣栧厛锛屼竴涓媿鑴戣鐨勬€濊矾灏辨槸鐢?鏆村姏绌蜂妇鍛楋紝鎴戠畝鍗曡涓嬫€濊矾锛?/p>

浣犱笉鏄鎴戞妸nums鍒嗗壊鎴?code class="mq-118">m涓瓙鏁扮粍锛岀劧鍚庤绠楀反鎷夊反鎷夊張鏄渶澶у張鏄渶灏忕殑閭d釜鏈€鍊煎悧锛熼偅鎴戞妸鎵€鏈夊垎鍓叉柟妗堥兘绌蜂妇鍑烘潵锛岄偅涓渶鍊艰偗瀹氬彲浠ョ畻鍑烘潵瀵瑰惂锛?/p>

鎬庝箞绌蜂妇鍛紵鎶?code class="mq-120">nums鍒嗗壊鎴?code class="mq-121">m涓瓙鏁扮粍锛岀浉褰撲簬鍦?code class="mq-122">len(nums)涓厓绱犵殑搴忓垪涓垏m - 1鍒€锛屽浜庢瘡涓や釜鍏冪礌涔嬮棿鐨勯棿闅欙紝鎴戜滑閮芥湁涓ょ銆岄€夋嫨銆嶏紝鍒囦竴鍒€锛屾垨鑰呬笉鍒囥€?/p>

浣犵湅锛岃繖涓嶅氨鏄爣鍑嗙殑鍥炴函鏆村姏绌蜂妇鎬濊矾鍢涳紝鎴戜滑鏍规嵁绌蜂妇缁撴灉鍘昏绠楁瘡绉嶆柟妗堢殑鏈€澶у瓙鏁扮粍鍜岋紝鑲畾鍙互绠楀嚭绛旀銆?/p>

浣嗘槸鍥炴函鐨勭己鐐瑰氨鏄鏉傚害寰堥珮锛屾垜浠垰鎵嶈鐨勬€濊矾鍏跺疄灏辨槸銆岀粍鍚堛€嶅槢锛屾椂闂村鏉傚害灏辨槸缁勫悎鍏紡锛?/p>

鏃堕棿澶嶆潅搴﹀叾瀹炴槸闈炲父楂樼殑锛屾墍浠ュ洖婧畻娉曚笉鏄竴涓ソ鐨勬€濊矾锛岃繕鏄緱涓婁簩鍒嗘煡鎵炬妧宸э紝鍙嶅悜鎬濊€冭繖閬撻銆?/p>

鐜板湪棰樼洰鏄浐瀹氫簡m鐨勫€硷紝璁╂垜浠‘瀹氫竴涓渶澶у瓙鏁扮粍鍜岋紱鎵€璋撳弽鍚戞€濊€冨氨鏄锛屾垜浠彲浠ュ弽杩囨潵锛岄檺鍒朵竴涓渶澶у瓙鏁扮粍鍜?code class="mq-131">max锛屾潵鍙嶆帹鏈€澶у瓙鏁扮粍鍜屼负max鏃讹紝鑷冲皯鍙互灏?code class="mq-133">nums鍒嗗壊鎴愬嚑涓瓙鏁扮粍銆?/p>

姣斿璇存垜浠彲浠ュ啓杩欐牱涓€涓?code class="mq-135">split鍑芥暟锛?/p>

// 鍦ㄦ瘡涓瓙鏁扮粍鍜屼笉瓒呰繃 max 鐨勬潯浠朵笅锛?/span>
// 璁$畻 nums 鑷冲皯鍙互鍒嗗壊鎴愬嚑涓瓙鏁扮粍
int split(int[] nums, int max);

姣斿璇?/span>nums = [7,2,5,10]锛岃嫢闄愬埗max = 10锛屽垯split鍑芥暟杩斿洖 3锛屽嵆nums鏁扮粍鏈€灏戣兘鍒嗗壊鎴愪笁涓瓙鏁扮粍锛屽垎鍒槸[7,2],[5],[10]銆?/span>

濡傛灉鎴戜滑鎵惧埌涓€涓渶灏?code class="mq-160">max鍊硷紝婊¤冻split(nums, max)鍜?code class="mq-162">m鐩哥瓑锛岄偅涔堣繖涓?code class="mq-163">max鍊间笉灏辨槸绗﹀悎棰樻剰鐨勩€屾渶灏忕殑鏈€澶у瓙鏁扮粍鍜屻€嶅悧锛?br>

鐜板湪灏辩畝鍗曚簡锛屾垜浠彧瑕佸max杩涜绌蜂妇灏辫锛岄偅涔堟渶澶у瓙鏁扮粍鍜?code class="mq-166">max鐨勫彇鍊艰寖鍥存槸浠€涔堝憿锛?/p>

鏄剧劧锛屽瓙鏁扮粍鑷冲皯鍖呭惈涓€涓厓绱狅紝鑷冲鍖呭惈鏁翠釜鏁扮粍锛屾墍浠ャ€屾渶澶с€嶅瓙鏁扮粍鍜岀殑鍙栧€艰寖鍥村氨鏄棴鍖洪棿[max(nums), sum(nums)]锛屼篃灏辨槸鏈€澶у厓绱犲€煎埌鏁翠釜鏁扮粍鍜屼箣闂淬€?/p>

閭d箞锛屾垜浠氨鍙互鍐欏嚭濡備笅浠g爜锛?/p>

/* 涓诲嚱鏁帮紝璁$畻鏈€澶у瓙鏁扮粍鍜?nbsp;*/
int splitArray(int[] nums, int m) {
    int lo = getMax(nums), hi = getSum(nums);
    for (int max = lo; max <= hi; max++) {
        // 濡傛灉鏈€澶у瓙鏁扮粍鍜屾槸 max锛?/span>
        // 鑷冲皯鍙互鎶?nbsp;nums 鍒嗗壊鎴?nbsp;n 涓瓙鏁扮粍
        int n = split(nums, max);
        // 涓轰粈涔堟槸 <= 涓嶆槸 == 锛?/span>
        if (n <= m) {
            return max;
        }
    }

    return -1;
}

/* 杈呭姪鍑芥暟锛岃嫢闄愬埗鏈€澶у瓙鏁扮粍鍜屼负 max锛?br>璁$畻 nums 鑷冲皯鍙互琚垎鍓叉垚鍑犱釜瀛愭暟缁?nbsp;*/
int split(int[] nums, int max) {
    // 鑷冲皯鍙互鍒嗗壊鐨勫瓙鏁扮粍鏁伴噺
    int count = 1;
    // 璁板綍姣忎釜瀛愭暟缁勭殑鍏冪礌鍜?/span>
    int sum = 0;
    for (int i = 0; i < nums.length; i++) {
        if (sum + nums[i] > max) {
            // 濡傛灉褰撳墠瀛愭暟缁勫拰澶т簬 max 闄愬埗
            // 鍒欒繖涓瓙鏁扮粍涓嶈兘鍐嶆坊鍔犲厓绱犱簡
            count++;
            sum = nums[i];
        } else {
            // 褰撳墠瀛愭暟缁勫拰杩樻病杈惧埌 max 闄愬埗
            // 杩樺彲浠ユ坊鍔犲厓绱?/span>
            sum += nums[i];
        }
    }
    return count;
}

// 璁$畻鏁扮粍涓殑鏈€澶у€?/span>
int getMax(int[] nums) {
    int res = 0;
    for (int n : nums)
        res = Math.max(n, res);
    return res;
}

// 璁$畻鏁扮粍鍏冪礌鍜?/span>
int getSum(int[] nums) {
    int res = 0;
    for (int n : nums)
        res += n;
    return res;
}

杩欐浠g爜鏈変袱涓叧閿棶棰橈細

1銆佸max鍙橀噺鐨勭┓涓炬槸浠?code class="mq-239">lo鍒?code class="mq-240">hi鍗充粠灏忓埌澶х殑銆?/p>

杩欐槸鍥犱负鎴戜滑姹傜殑鏄€屾渶澶у瓙鏁扮粍鍜屻€嶇殑銆屾渶灏忓€笺€嶏紝涓?code class="mq-242">split鍑芥暟鐨勮繑鍥炲€兼湁鍗曡皟鎬э紝鎵€浠ヤ粠灏忓埌澶ч亶鍘嗭紝绗竴涓弧瓒虫潯浠剁殑鍊煎氨鏄€屾渶灏忓€笺€嶃€?/p>

2銆佸嚱鏁拌繑鍥炵殑鏉′欢鏄?code class="mq-245">n <= m锛岃€屼笉鏄?code class="mq-246">n == m銆傛寜鐓т箣鍓嶇殑鎬濊矾锛屽簲璇?code class="mq-247">n == m鎵嶅鍚э紵

鍏跺疄锛?code class="mq-249">split鍑芥暟閲囩敤浜嗚椽蹇冪殑绛栫暐锛岃绠楃殑鏄?code class="mq-250">max闄愬埗涓?span class="mq-251">鑷冲皯鑳藉灏?code class="mq-252">nums鍒嗗壊鎴愬嚑涓瓙鏁扮粍銆?/p>

涓句釜渚嬪瓙锛岃緭鍏?code class="mq-254">nums = [2,1,1], m = 3锛屾樉鐒跺垎鍓叉柟娉曞彧鏈変竴绉嶏紝鍗虫瘡涓厓绱犻兘璁や负鏄竴涓瓙鏁扮粍锛屾渶澶у瓙鏁扮粍鍜屼负 2銆?/p>

浣嗘槸锛屾垜浠殑绠楁硶浼氬湪鍖洪棿[2,4]绌蜂妇max锛屽綋max = 2鏃讹紝split浼氱畻鍑?code class="mq-260">nums鑷冲皯鍙互琚垎鍓叉垚n = 2涓瓙鏁扮粍[2]鍜?code class="mq-264">[1,1]銆?/p>

褰?code class="mq-266">max = 3鏃剁畻鍑?code class="mq-267">n = 2锛屽綋max = 4鏃剁畻鍑?code class="mq-269">n = 1锛屾樉鐒堕兘鏄皬浜?code class="mq-270">m = 3鐨勩€?/p>

鎵€浠ユ垜浠笉鑳界敤n == m鑰屽繀椤荤敤n <= m鏉ユ壘鍒扮瓟妗堬紝鍥犱负濡傛灉浣犺兘鎶?code class="mq-275">nums鍒嗗壊鎴?2 涓瓙鏁扮粍锛?code class="mq-276">[2],[1,1]锛夛紝閭d箞鑲畾涔熷彲浠ュ垎鍓叉垚 3 涓瓙鏁扮粍锛?code class="mq-277">[2],[1],[1]锛?/strong>銆?/p>

濂戒簡锛岀幇鍦?for 寰幆鐨勬毚鍔涚畻娉曞凡缁忓啓瀹屼簡锛屼絾鏄棤娉曢€氳繃鍔涙墸鐨勫垽棰樼郴缁燂紝浼氳秴鏃躲€?/p>

鐢变簬split鏄崟璋冨嚱鏁帮紝涓旂鍚堜簩鍒嗘煡鎵炬妧宸ц繘琛屼紭鍖栫殑鏍囧織锛屾墍浠ュ彲浠ヨ瘯鍥炬敼閫犳垚浜屽垎鏌ユ壘銆?/p>

閭d箞搴旇浣跨敤鎼滅储宸︿晶杈圭晫鐨勪簩鍒嗘煡鎵撅紝杩樻槸鎼滅储鍙充晶杈圭晫鐨勪簩鍒嗘煡鎵惧憿锛熻繖涓繕鏄鐪嬫垜浠殑绠楁硶閫昏緫锛?/p>

int lo = getMax(nums), hi = getSum(nums);
for (int max = lo; max <= hi; max++) {
    int n = split(nums, max);
    if (n <= m) {
        return max;
    }
}

鍙兘瀛樺湪澶氫釜max浣垮緱split(nums, max)绠楀嚭鐩稿悓鐨?code class="mq-293">n锛?span class="mq-294">鍥犱负鎴戜滑鐨勭畻娉曚細杩斿洖鏈€灏忕殑閭d釜max锛屾墍浠ュ簲璇ヤ娇鐢ㄦ悳绱㈠乏渚ц竟鐣岀殑浜屽垎鏌ユ壘绠楁硶銆?/p>

鐜板湪锛岄棶棰樺彉涓猴細鍦ㄩ棴鍖洪棿[lo, hi]涓悳绱竴涓渶灏忕殑max锛屼娇寰?code class="mq-299">split(nums, max)鎭板ソ绛変簬m銆?/p>

閭d箞锛屾垜浠氨鍙互鐩存帴濂楃敤鎼滅储宸︿晶杈圭晫鐨勪簩鍒嗘悳绱㈡鏋舵敼鍐欎唬鐮侊細

int splitArray(int[] nums, int m) {
    // 涓€鑸悳绱㈠尯闂存槸宸﹀紑鍙抽棴鐨勶紝鎵€浠?nbsp;hi 瑕侀澶栧姞涓€
    int lo = getMax(nums), hi = getSum(nums) + 1;
    while (lo < hi) {
        int mid = lo + (hi - lo) / 2;
        // 鏍规嵁鍒嗗壊瀛愭暟缁勭殑涓暟鏀剁缉鎼滅储鍖洪棿
        int n = split(nums, mid);
        if (n == m) {
            // 鏀剁缉鍙宠竟鐣岋紝杈惧埌鎼滅储宸﹁竟鐣岀殑鐩殑
            hi = mid;
        } else if (n < m) {
            // 鏈€澶у瓙鏁扮粍鍜屼笂闄愰珮浜嗭紝鍑忓皬涓€浜?/span>
            hi = mid;
        } else if (n > m) {
            // 鏈€澶у瓙鏁扮粍鍜屼笂闄愪綆浜嗭紝澧炲姞涓€浜?/span>
            lo = mid + 1;
        }
    }
    return lo;
}

int split(int[] nums, int max) {/* 瑙佷笂鏂?nbsp;*/}
int getMax(int[] nums) {/* 瑙佷笂鏂?nbsp;*/}
int getSum(int[] nums) {/* 瑙佷笂鏂?nbsp;*/}

杩欐浜屽垎鎼滅储鐨勪唬鐮佸氨鏄爣鍑嗙殑鎼滅储宸︿晶杈圭晫鐨勪唬鐮佹鏋讹紝濡傛灉涓嶇悊瑙e彲浠ュ弬瑙佸墠鏂?锛岃繖閲屽氨涓嶅睍寮€浜嗐€?/p>

鑷虫锛岃繖閬撻灏遍€氳繃浜屽垎鏌ユ壘鎶€宸ч珮鏁堣В鍐充簡銆傚亣璁?code class="mq-349">nums鍏冪礌涓暟涓?code class="mq-350">N锛屽厓绱犲拰涓?code class="mq-351">S锛屽垯split鍑芥暟鐨勫鏉傚害涓?code class="mq-353">O(N)锛屼簩鍒嗘煡鎵剧殑澶嶆潅搴︿负O(logS)锛屾墍浠ョ畻娉曠殑鎬绘椂闂村鏉傚害涓?code class="mq-355">O(N*logS)銆?/p>

寰€鏈?/span>鎺?/span>鑽?/span> 馃敆





锛匡伎锛匡伎锛匡伎锛匡伎锛匡伎锛匡伎锛?/span>

瀛﹀ソ绠楁硶闈犲璺紝璁ゅ噯 labuladong锛?/strong>鐭ヤ箮銆丅绔欒处鍙峰悓鍚嶃€?/strong>


以上是关于的主要内容,如果未能解决你的问题,请参考以下文章

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

片段和活动之间的核心区别是啥?哪些代码可以写成片段?

VSCode自定义代码片段——.vue文件的模板

VSCode自定义代码片段6——CSS选择器

VSCode自定义代码片段——声明函数

VSCode自定义代码片段8——声明函数