2130、連結串列最大孿生和 | 演算法(leetode,附思維導圖 + 全部解法)300題

碼農三少發表於2022-01-21

零 標題:演算法(leetode,附思維導圖 + 全部解法)300題之(2130)連結串列最大孿生和

一 題目描述

題目描述
題目描述
題目描述

二 解法總覽(思維導圖)

思維導圖

三 全部解法

1 方案1

1)程式碼:

// 方案1 “化歸法(即 把不熟悉的變成熟悉的、複雜的變成簡單的,如 這裡先將連結串列 轉換成 陣列)”。
// 技巧:原輸入為連結串列可以考慮將其轉換成陣列,因為連結串列的增、刪操作便捷,但按索引位置查詢(陣列便捷)操作不便捷!

// 思路:
// 1)狀態初始化: resList = [], resMax = Number.NEGATIVE_INFINITY 。
// 2)核心1:遍歷 連結串列 ,將每個節點值 依次 存入陣列 resList 中。
// 3)核心2:遍歷 resList 的前半部分,求得每個 孿生和(即 tempSum ) 。
// 3.1)更新 resMax ,resMax = Math.max(resMax, tempSum) 。
// 4)返回結果 resMax 。
var pairSum = function(head) {
    // 1)狀態初始化: resList = [], resMax = Number.NEGATIVE_INFINITY 。
    let resList = [],
        resMax = Number.NEGATIVE_INFINITY;
    
    // 2)核心1:遍歷 連結串列 ,將每個節點值 依次 存入陣列 resList 中。
    while (head) {
        resList.push(head.val);
        head = head.next;
    }

    // 3)核心2:遍歷 resList 的前半部分,求得每個 孿生和(即 tempSum ) 。
    const l = resList.length;
    for (let i = 0; i < Math.floor(l / 2); i++) {
        const tempSum = resList[i] + resList[l - i - 1];
        // 3.1)更新 resMax ,resMax = Math.max(resMax, tempSum) 。
        resMax = Math.max(resMax, tempSum);
    }

    // 4)返回結果 resMax 。
    return resMax;
};

2 方案2

1)程式碼:

// 方案2 “快慢指標 + 雙指標 法”。
// 參考:
// 1)https://leetcode-cn.com/problems/maximum-twin-sum-of-a-linked-list/solution/shuang-zhou-sai-di-69chang-leetcode5961l-rals/

// 思路:
// 1)狀態初始化:slow = head, fast = head, resSum = Number.NEGATIVE_INFINITY 。
// 2)核心1:通過 快慢指標,尋找連結串列中點。
// 3)核心2:反轉後半部分的連結串列。
// 4)核心3:通過 雙指標,計算所有的孿生和(即 tempSum )。
// 5)返回結果 resSum 。
var pairSum = function(head) {
    // 1)狀態初始化:slow = head, fast = head, resSum = Number.NEGATIVE_INFINITY 。
    let slow = head,
        fast = head,
        resSum = Number.NEGATIVE_INFINITY;

    // 2)核心1:通過 快慢指標,尋找連結串列中點。
    while (fast !== null && fast.next !== null) {
        fast = fast.next.next;
        slow = slow.next;
    }

    // 3)核心2:反轉後半部分的連結串列。
    let cur = slow,
        pre = null;
    while (cur !== null) {
        let tempNode = cur.next;
        cur.next = pre;
        pre = cur;
        cur = tempNode;
    }

    // 4)核心3:通過 雙指標,計算所有的孿生和(即 tempSum )。
    while (head !== null && pre !== null) {
        // 4.1)根據情況,更新 resSum 值(從 resSum、tempSum 中取最大值)。
        const tempSum = (head.val + pre.val);
        resSum = Math.max(resSum, tempSum);
        head = head.next;
        pre = pre.next;
    }

    // 5)返回結果 resSum 。
    return resSum;
}

四 資源分享 & 更多

1 歷史文章 - 總覽

歷史文章 - 總覽

刷題進度 - LeetCode:355 / 2492 、《劍指offer》:66 / 66

2 【資源分享】演算法通關 + 面試寶典演算法通關 + 面試寶典

1)演算法通關40講(極客 - 外企大佬講的):
連結: https://pan.baidu.com/s/1C175QEmcAunjnCzYzoLBz 提取碼: hjna

2)動態規劃專題(價值幾百美刀~):https://www.bilibili.com/video/BV1nt4y1Y7nz

3)前端面經:
3.1)https://www.nowcoder.com/tutorial/96
3.2)https://muyiy.cn/question
3.3)https://hub.fastgit.org/haizlin/fe-interview/blob/master/category/history.md

注:若失效請前往VX公眾號: 碼農三少 ,傳送關鍵字: LeetCode 或 演算法 ,即可獲取最新的連結~

演算法通關 + 面試寶典

3 博主簡介

碼農三少 ,一個致力於編寫 極簡、但齊全題解(演算法) 的博主。
專注於 一題多解、結構化思維 ,歡迎一起刷穿 LeetCode ~

博主簡介

相關文章