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

LeetCode Meditations:合并 K 排序列表

這篇具有很好參考價值的文章主要介紹了LeetCode Meditations:合并 K 排序列表。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

LeetCode Meditations:合并 K 排序列表,LeetCode,算法,leetcode,算法,javascript,數(shù)據(jù)結(jié)構(gòu)

描述 合并K分類列表 狀態(tài):

您有一系列 k 鏈接-列表 lists ,每個鏈接-列表按升序排序。

合并所有鏈接-列表為一個排序的鏈接-列出并返回。

例如:

Input: lists = [[1, 4, 5], [1, 3, 4], [2, 6]]
Output: [1, 1, 2, 3, 4, 4, 5, 6]
Explanation: The linked-lists are:
[
  1->4->5,
  1->3->4,
  2->6
]
merging them into one sorted list:
1->1->2->3->4->4->5->6

起初這個問題有點讓我感到困惑,但是 NEETCODE 很有意義。

解決方案的方法是 合并排序算法 ,這是您從任何介紹性計算機科學(xué)課程中可能記得的最熟悉的算法之一。

現(xiàn)在,當(dāng)我們將數(shù)組作為輸入作為輸入時,我們通常會合并排序,我們將數(shù)組遞歸將數(shù)組分為左和右半,并繼續(xù)合并它們,直到整個數(shù)組對整個數(shù)組進行排序。這是我們熟悉的朋友在JavaScript中的樣子:

function mergeSort(arr) {
  if (arr.length <= 1) {
    return arr;
  }

  let left = arr.slice(0, Math.floor(arr.length / 2));
  let right = arr.slice(Math.floor(arr.length / 2), arr.length);

  mergeSort(left);
  mergeSort(right);

  merge(left, right, arr);

  return arr;
}


function merge(left, right, arr) {
  let index = 0;

  while (left.length && right.length) {
    if (left[0] < right[0]) {
      arr[index++] = left.shift();
    } else {
      arr[index++] = right.shift();
    }
  }

  while (left.length) {
    arr[index++] = left.shift();
  }

  while (right.length) {
    arr[index++] = right.shift();
  }
}

但是,我們要使用的是 * merge 功能。

由于我們還使用鏈接列表,因此看起來會有所不同。使用TypeScript,看起來像這樣:

function merge(list1: ListNode | null, list2: ListNode | null) {
  let result = new ListNode(0);
  let currentNode = result;

  while (list1 !== null && list2 !== null) {
    if (list1.val < list2.val) {
      currentNode.next = list1;
      list1 = list1.next;
    } else {
      currentNode.next = list2;
      list2 = list2.next;
    }

    currentNode = currentNode.next;
  }

  if (list1 !== null) {
    currentNode.next = list1;
  }

  if (list2 !== null) {
    currentNode.next = list2;
  }

  return result.next;
}

自從我們給予 k 排序列表,我們將合并列表對,并繼續(xù)合并 lists 大于1:

function mergeKLists(lists: Array<ListNode | null>): ListNode | null {
  if (lists === null || lists.length === 0) {
    return null;
  }

  while (lists.length > 1) {
    let mergedLists = [];
    for (let i = 0; i < lists.length; i += 2) {
      let list1 = lists[i];
      let list2 = i + 1 < lists.length ? lists[i + 1] : null;
      mergedLists.push(merge(list1, list2));
    }

    lists = mergedLists;
  } 

  return lists[0];
};
筆記
如果 list2null (在長度的情況下 lists 甚至不是),合并 list1list2 將是 list1

總體而言,解決方案看起來像這樣:

/**
 * Definition for singly-linked list.
 * class ListNode {
 *   val: number
 *   next: ListNode | null
 *   constructor(val?: number, next?: ListNode | null) {
 *     this.val = (val === undefined ? 0 : val)
 *     this.next = (next === undefined ? null : next)
 *   }
 * }
 */

function mergeKLists(lists: Array<ListNode | null>): ListNode | null {
  if (lists === null || lists.length === 0) {
    return null;
  }

  while (lists.length > 1) {
    let mergedLists = [];
    for (let i = 0; i < lists.length; i += 2) {
      let list1 = lists[i];
      let list2 = i + 1 < lists.length ? lists[i + 1] : null;
      mergedLists.push(merge(list1, list2));
    }

    lists = mergedLists;
  } 

  return lists[0];
};

function merge(list1: ListNode | null, list2: ListNode | null) {
  let result = new ListNode(0);
  let currentNode = result;

  while (list1 !== null && list2 !== null) {
    if (list1.val < list2.val) {
      currentNode.next = list1;
      list1 = list1.next;
    } else {
      currentNode.next = list2;
      list2 = list2.next;
    }

    currentNode = currentNode.next;
  }

  if (list1 !== null) {
    currentNode.next = list1;
  }

  if (list2 !== null) {
    currentNode.next = list2;
  }

  return result.next;
}
時間和空間復(fù)雜性

時間復(fù)雜性是o(n log k)o(n\ log\ k) - 也看 NEETCODE的解釋 - ,如果您記得合并排序功能的時間復(fù)雜性是o(n log n)o(n\ 日志\ n) :我們通過合并操作中的每個項目,但是由于每次輸入都會減半,我們會記錄NLOG\ n次。在這里類似,nn是指節(jié)點的數(shù)量,而kk是列表的數(shù)量。
空間復(fù)雜性是O(k)o(k) 當(dāng)我們保留臨時的時,kk是列表的數(shù)量 mergedLists 多變的。文章來源地址http://www.zghlxwxcb.cn/news/detail-851178.html


到了這里,關(guān)于LeetCode Meditations:合并 K 排序列表的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 【Leetcode -21.合并兩個有序鏈表 -83.刪除排序鏈表中的重復(fù)元素】

    【Leetcode -21.合并兩個有序鏈表 -83.刪除排序鏈表中的重復(fù)元素】

    題目:將兩個升序鏈表合并為一個新的 升序 鏈表并返回。新鏈表是通過拼接給定的兩個鏈表的所有節(jié)點組成的。 示例 1: 輸入:l1 = [1, 2, 4], l2 = [1, 3, 4] 輸出:[1, 1, 2, 3, 4, 4] 示例 2: 輸入:l1 = [], l2 = [] 輸出:[] 示例 3: 輸入:l1 = [], l2 = [0] 輸出:[0] 我們的思路是,先定義

    2023年04月24日
    瀏覽(29)
  • 【算法之貪心算法IV】leetcode56. 合并區(qū)間

    【算法之貪心算法IV】leetcode56. 合并區(qū)間

    力扣題目鏈接 有一些球形氣球貼在一堵用 XY 平面表示的墻面上。墻面上的氣球記錄在整數(shù)數(shù)組 points ,其中 points[i] = [xstart, xend] 表示水平直徑在 xstart 和 xend 之間的氣球。你不知道氣球的確切 y 坐標(biāo)。 一支弓箭可以沿著 x 軸從不同點 完全垂直 地射出。在坐標(biāo) x 處射出一支箭

    2024年02月11日
    瀏覽(90)
  • Leetcode算法遞歸類—合并兩個有序鏈表

    Leetcode算法遞歸類—合并兩個有序鏈表

    目錄 21.?合并兩個有序鏈表 題解: 代碼: 將兩個升序鏈表合并為一個新的? 升序 ?鏈表并返回。新鏈表是通過拼接給定的兩個鏈表的所有節(jié)點組成的。? 示例 1: 示例 2: 示例 3: 提示: 兩個鏈表的節(jié)點數(shù)目范圍是? [0, 50] -100 = Node.val = 100 l1 ?和? l2 ?均按? 非遞減順序 ?

    2024年02月13日
    瀏覽(33)
  • LeetCode面試算法-力扣 88. 合并兩個有序數(shù)組

    88. 合并兩個有序數(shù)組 題目描述 ? ? 給你兩個按 非遞減順序 排列的整數(shù)數(shù)組 nums1 和 nums2,另有兩個整數(shù) m 和 n ,分別表示 nums1 和 nums2 中的元素數(shù)目。請你 合并 nums2 到 nums1 中,使合并后的數(shù)組同樣按 非遞減順序 排列。 注意: 最終,合并后數(shù)組不應(yīng)由函數(shù)返回,而是存儲

    2024年02月10日
    瀏覽(19)
  • 算法leetcode|88. 合并兩個有序數(shù)組(rust重拳出擊)

    給你兩個按 非遞減順序 排列的整數(shù)數(shù)組 nums1 和 nums2 ,另有兩個整數(shù) m 和 n ,分別表示 nums1 和 nums2 中的元素數(shù)目。 請你 合并 nums2 到 nums1 中,使合并后的數(shù)組同樣按 非遞減順序 排列。 注意 :最終,合并后數(shù)組不應(yīng)由函數(shù)返回,而是存儲在數(shù)組 nums1 中。為了應(yīng)對這種情況

    2024年02月05日
    瀏覽(21)
  • 算法沉淀——BFS 解決拓撲排序(leetcode真題剖析)

    算法沉淀——BFS 解決拓撲排序(leetcode真題剖析)

    Breadth-First Search (BFS) 在拓撲排序中的應(yīng)用主要是用來解決有向無環(huán)圖(DAG)的拓撲排序問題。拓撲排序是對有向圖中所有節(jié)點的一種線性排序,使得對于每一條有向邊 (u, v),節(jié)點 u 在排序中都出現(xiàn)在節(jié)點 v 的前面。如果圖中存在環(huán)路,則無法進行拓撲排序。 BFS 解決拓撲排序

    2024年02月21日
    瀏覽(27)
  • 【LeetCode 算法】Merge k Sorted Lists 合并 K 個升序鏈表

    給你一個鏈表數(shù)組,每個鏈表都已經(jīng)按升序排列。 請你將所有鏈表合并到一個升序鏈表中,返回合并后的鏈表。 k = = l i s t s . l e n g t h 0 = k = 1 0 4 0 = l i s t s [ i ] . l e n g t h = 500 ? 1 0 4 = l i s t s [ i ] [ j ] = 1 0 4 l i s t s [ i ] 按升序排列 l i s t s [ i ] . l e n g t h 的總和不超過 1 0

    2024年02月13日
    瀏覽(17)
  • 【算法】排序+雙指針——leetcode三數(shù)之和、四數(shù)之和

    【算法】排序+雙指針——leetcode三數(shù)之和、四數(shù)之和

    三數(shù)之和 (1)排序+雙指針 ??算法思路: 和之前的兩數(shù)之和類似,我們對暴力枚舉進行了一些優(yōu)化,利用了 排序+雙指針 的思路: ??我們先排序,然后固定?個數(shù) a ,接著我們就可以在這個數(shù)后面的區(qū)間內(nèi),使用之前兩數(shù)之和使用的算法,快速找到兩個數(shù)之和和固定的

    2024年02月13日
    瀏覽(31)
  • 【leetcode刷題之路】劍指Offer(4)——分治+排序算法+動態(tài)規(guī)劃

    8 分治算法 8.1 【遞歸】劍指 Offer 07 - 重建二叉樹 https://leetcode.cn/problems/zhong-jian-er-cha-shu-lcof/ ??前序遍歷是根左右,中序遍歷是左根右,這也就意味著前序遍歷的第一個節(jié)點是整棵樹的根節(jié)點,順著這個節(jié)點找到它在中序遍歷中的位置,即為in_root,那么in_root左邊的都在左子

    2024年02月11日
    瀏覽(23)
  • 算法leetcode|81. 搜索旋轉(zhuǎn)排序數(shù)組 II(rust重拳出擊)

    算法leetcode|81. 搜索旋轉(zhuǎn)排序數(shù)組 II(rust重拳出擊)

    已知存在一個按非降序排列的整數(shù)數(shù)組 nums ,數(shù)組中的值不必互不相同。 在傳遞給函數(shù)之前, nums 在預(yù)先未知的某個下標(biāo) k ( 0 = k nums.length )上進行了 旋轉(zhuǎn) ,使數(shù)組變?yōu)?[nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]] (下標(biāo) 從 0 開始 計數(shù))。例如, [0,1,2,4,4,4,5,6,

    2024年02月07日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包