国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

想要精通算法和SQL的成長(zhǎng)之路 - 分割數(shù)組的最大值

這篇具有很好參考價(jià)值的文章主要介紹了想要精通算法和SQL的成長(zhǎng)之路 - 分割數(shù)組的最大值。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前言

想要精通算法和SQL的成長(zhǎng)之路 - 系列導(dǎo)航

一. 分割數(shù)組的最大值

原題鏈接
想要精通算法和SQL的成長(zhǎng)之路 - 分割數(shù)組的最大值,精通算法和SQL之路,算法,sql,java
首先面對(duì)這個(gè)題目,我們可以捕獲幾個(gè)關(guān)鍵詞:

  • 非負(fù)整數(shù)。
  • 非空連續(xù)子數(shù)組。

那么我們假設(shè)分割后的子數(shù)組,和的最大值是M,對(duì)應(yīng)分割的子數(shù)組個(gè)數(shù)為N。他們之間必然存在以下關(guān)系:

  • 分割的子數(shù)組個(gè)數(shù) N 越多,對(duì)應(yīng)的和最大值 M 也就越小。
  • 分割的子數(shù)組個(gè)數(shù) N 越少,對(duì)應(yīng)的和最大值 M 也就越大。

那么我們以每組和的最大值作為切入點(diǎn),案例如下:

  • 設(shè)置 數(shù)組各自和的最大值 為 20,此時(shí)分割依然是 [7, 2, 5, | 10, 8],此時(shí)分割的數(shù)組數(shù)為2。
  • 設(shè)置 數(shù)組各自和的最大值 為 19,此時(shí)分割依然是 [7, 2, 5, | 10, 8],此時(shí)分割的數(shù)組數(shù)為2。
  • 設(shè)置 數(shù)組各自和的最大值 為 18,此時(shí)分割依然是 [7, 2, 5, | 10, 8],此時(shí)分割的數(shù)組數(shù)為2。
  • 設(shè)置 數(shù)組各自和的最大值 為 17,此時(shí)分割就變成了 [7, 2, 5, | 10, | 8],此時(shí)分割的數(shù)組數(shù)為3。

而我們題目要求分割組數(shù)是2,那么滿(mǎn)足這個(gè)條件的幾種情況,我們?cè)偃∽畲蠛妥钚〉那闆r,最終得到結(jié)果是18。

1.1 二分法

二分的目標(biāo)對(duì)象是什么?我們可以二分:數(shù)組各自和的最大值。那么二分法,就應(yīng)該有初始區(qū)間:

  • left:可以是當(dāng)前數(shù)組的最大元素值。(單個(gè)元素一組)
  • right:可以是當(dāng)前數(shù)組的總和。(所有元素成一組)

那么我們二分后取得 mid

int mid = left + (right - left) / 2;

接下來(lái)我們就要對(duì)數(shù)組進(jìn)行分組計(jì)算了,對(duì)數(shù)組從左往右按順序分組,使得分組后的各個(gè)子數(shù)組和不能超過(guò)mid。我們可以編寫(xiě)個(gè)helper函數(shù):

public int helper(int[] nums, int maxGroupSum) {
    // 分組數(shù)最小是1
    int res = 1;
    int curSum = 0;
    for (int num : nums) {
        // 如果加入當(dāng)前元素會(huì)導(dǎo)致和超過(guò)限制,那么就另外再分一組
        if (curSum + num > maxGroupSum) {
            res++;
            curSum = 0;
        }
        curSum += num;
    }
    return res;
}

我們計(jì)算好分組后的個(gè)數(shù)groupNum之后,就需要和題目傳入的k進(jìn)行對(duì)比:

  • groupNum > k : 說(shuō)明數(shù)組各自和的最大值還是小了,我們應(yīng)該調(diào)大數(shù)組各自和的最大值。即left = mid +1。
  • 反之:right = mid;

最終代碼如下:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-725422.html

public int splitArray(int[] nums, int k) {
    int max = 0, sum = 0;
    for (int num : nums) {
        max = Math.max(max, num);
        sum += num;
    }
    int left = max, right = sum;
    while (left < right) {
        int mid = left + (right - left) / 2;
        // 如果分組數(shù)比 k 還要大,說(shuō)明每個(gè)分組的和最大值還是小了
        int groupNum = helper(nums, mid);
        if (groupNum > k) {
            left = mid + 1;
        } else {
            right = mid;
        }
    }
    return left;
}

public int helper(int[] nums, int maxGroupSum) {
    // 分組數(shù)最小是1
    int res = 1;
    int curSum = 0;
    for (int num : nums) {
        // 如果加入當(dāng)前元素會(huì)導(dǎo)致和超過(guò)限制,那么就另外再分一組
        if (curSum + num > maxGroupSum) {
            res++;
            curSum = 0;
        }
        curSum += num;
    }
    return res;
}

到了這里,關(guān)于想要精通算法和SQL的成長(zhǎng)之路 - 分割數(shù)組的最大值的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 想要精通算法和SQL的成長(zhǎng)之路 - 滑動(dòng)窗口和大小根堆

    想要精通算法和SQL的成長(zhǎng)之路 - 滑動(dòng)窗口和大小根堆

    想要精通算法和SQL的成長(zhǎng)之路 - 系列導(dǎo)航 先來(lái)說(shuō)下大小根堆是什么: 大根堆:棧頂元素最大(上圖左側(cè)部分),棧底至棧頂元素值遞增。 小根堆:棧頂元素最?。ㄉ蠄D右側(cè)部分),棧底至棧頂元素值遞減。 在 Java 當(dāng)中,可以用什么來(lái)表示大小根堆? 小根堆: 大根堆: 大小

    2024年02月07日
    瀏覽(21)
  • 想要精通算法和SQL的成長(zhǎng)之路 - 二叉樹(shù)的序列化和反序列化問(wèn)題

    想要精通算法和SQL的成長(zhǎng)之路 - 二叉樹(shù)的序列化和反序列化問(wèn)題

    想要精通算法和SQL的成長(zhǎng)之路 - 系列導(dǎo)航 二叉樹(shù)的層序遍歷 像這種從上至下并且按層打印的,可以稱(chēng)之為 二叉樹(shù)的廣度優(yōu)先搜索( BFS ) 。而這類(lèi)算法往往借助 隊(duì)列的一個(gè)先入先出特性 來(lái)實(shí)現(xiàn)。 那么有這么幾個(gè)步驟: 1.特殊處理還有初始化動(dòng)作。 2. BFS 循環(huán): 最終完整代

    2024年02月07日
    瀏覽(31)
  • 算法每日一題: 分割數(shù)組的最大值 | 動(dòng)歸 | 分割數(shù)組 | 貪心+二分

    算法每日一題: 分割數(shù)組的最大值 | 動(dòng)歸 | 分割數(shù)組 | 貪心+二分

    Hello,大家好,我是星恒 嗚嗚嗚,今天給大家?guī)?lái)的又是一道經(jīng)典的動(dòng)歸難題。 題目:leetcode 410 給定一個(gè)非負(fù)整數(shù)數(shù)組 nums 和一個(gè)整數(shù) k ,你需要將這個(gè)數(shù)組分成 k_ 個(gè)非空的連續(xù)子數(shù)組。 設(shè)計(jì)一個(gè)算法使得這 k _個(gè)子數(shù)組各自和的最大值最小。 示例: 示例 1: 示例 2: 示例

    2024年01月22日
    瀏覽(21)
  • LC 410. 分割數(shù)組的最大值

    難度: 困難 題目大意: 給定一個(gè)非負(fù)整數(shù)數(shù)組 nums 和一個(gè)整數(shù) k ,你需要將這個(gè)數(shù)組分成 k 個(gè)非空的連續(xù)子數(shù)組。 設(shè)計(jì)一個(gè)算法使得這 k 個(gè)子數(shù)組各自和的最大值最小。 提示: 1 = nums.length = 1000 0 = nums[i] = 10^6 1 = k = min(50, nums.length) 示例 1: 類(lèi)似 \\\"最大值最小\\\" 這樣的字眼就

    2024年01月23日
    瀏覽(22)
  • LeetCode-410.分割數(shù)組的最大值

    原題鏈接:https://leetcode.cn/problems/split-array-largest-sum/description 題面 給定一個(gè)非負(fù)整數(shù)數(shù)組 nums 和一個(gè)整數(shù) k ,你需要將這個(gè)數(shù)組分成 k 個(gè)非空的連續(xù)子數(shù)組。設(shè)計(jì)一個(gè)算法使得這 k 個(gè)子數(shù)組各自和的最大值最小。 思路 數(shù)組定義:f[i][j]: 前i個(gè)數(shù)字,分為j段各自和的最大值 狀

    2024年01月22日
    瀏覽(24)
  • LeetCode 0410.分割數(shù)組的最大值:二分

    力扣題目鏈接:https://leetcode.cn/problems/split-array-largest-sum/ 給定一個(gè)非負(fù)整數(shù)數(shù)組 nums 和一個(gè)整數(shù)? m ,你需要將這個(gè)數(shù)組分成? m ? 個(gè)非空的連續(xù)子數(shù)組。 設(shè)計(jì)一個(gè)算法使得這? m ? 個(gè)子數(shù)組各自和的最大值最小。 ? 示例 1: 示例 2: 示例 3: ? 提示: 1 = nums.length = 1000 0 =

    2024年02月20日
    瀏覽(27)
  • leetcode410. 分割數(shù)組的最大值(java)

    leetcode410. 分割數(shù)組的最大值(java)

    難度 - 困難 410. 分割數(shù)組的最大值 給定一個(gè)非負(fù)整數(shù)數(shù)組 nums 和一個(gè)整數(shù) m ,你需要將這個(gè)數(shù)組分成 m 個(gè)非空的連續(xù)子數(shù)組。 設(shè)計(jì)一個(gè)算法使得這 m 個(gè)子數(shù)組各自和的最大值最小。 示例 1: 輸入:nums = [7,2,5,10,8], m = 2 輸出:18 解釋?zhuān)?一共有四種方法將 nums 分割為 2 個(gè)子數(shù)組

    2024年02月10日
    瀏覽(27)
  • leetcode410. 分割數(shù)組的最大值 動(dòng)態(tài)規(guī)劃

    hard:https://leetcode.cn/problems/split-array-largest-sum/ 給定一個(gè)非負(fù)整數(shù)數(shù)組 nums 和一個(gè)整數(shù) m , 你需要將這個(gè)數(shù)組分成 m 個(gè)非空的連續(xù)子數(shù)組 。 設(shè)計(jì)一個(gè)算法使得這 m 個(gè)子數(shù)組各自和 的 最大值最小 。 令 dp[i][j]表示將數(shù)組的 前 i 個(gè)數(shù)分割為 j 組 所能得到的最大連續(xù)子數(shù)組和的最

    2024年02月13日
    瀏覽(22)
  • 【LeetCode每日一題】410. 分割數(shù)組的最大值

    【LeetCode每日一題】410. 分割數(shù)組的最大值

    2024-1-21 410. 分割數(shù)組的最大值 思路:二分查找+貪心 利用二分查找法和貪心算法來(lái)求解將數(shù)組分割為m個(gè)非空連續(xù)子數(shù)組,使得每個(gè)子數(shù)組的和的最大值最小 首先,我們需要確定二分查找的左右邊界。左邊界 left 初始化為數(shù)組中的最大值,右邊界 right 初始化為數(shù)組所有元素的

    2024年01月23日
    瀏覽(25)
  • 【LeetCode: 410. 分割數(shù)組的最大值 | 暴力遞歸=>記憶化搜索=>動(dòng)態(tài)規(guī)劃 】

    【LeetCode: 410. 分割數(shù)組的最大值 | 暴力遞歸=>記憶化搜索=>動(dòng)態(tài)規(guī)劃 】

    ?? 算法題 ?? ?? 算法刷題專(zhuān)欄 | 面試必備算法 | 面試高頻算法 ?? ?? 越難的東西,越要努力堅(jiān)持,因?yàn)樗哂泻芨叩膬r(jià)值,算法就是這樣? ?? 作者簡(jiǎn)介:碩風(fēng)和煒,CSDN-Java領(lǐng)域優(yōu)質(zhì)創(chuàng)作者??,保研|國(guó)家獎(jiǎng)學(xué)金|高中學(xué)習(xí)JAVA|大學(xué)完善JAVA開(kāi)發(fā)技術(shù)棧|面試刷題|面經(jīng)八股文

    2024年02月10日
    瀏覽(55)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包