1. 程式人生 > >合併已排序的陣列

合併已排序的陣列

數組合並

條件:

  1. 兩個陣列分別已經升序排列

要求:

  • 合併兩個陣列並返回新的已經排序後的陣列

分析該題目,其要求與歸併排序的實現思想相同

歸併排序的演算法中,使用“分治”策略,而這道題的實現邏輯,僅需要用到歸併演算法中的“治”

實現一

fun mergeArray(first: Array<Int>, sec: Array<Int>): Array<Int> {
    val temp = Array(first.size + sec.size) { 0 }
    var t = 0
var i = 0 var j = 0 // 取較短的陣列作為loop條件 var mid = if (first.size <= sec.size) first.size - 1 else sec.size - 1 while (i <= mid && j <= mid) { //關鍵的邏輯在於這行 temp[t++] = if (first[i] < sec[j]) first[i++] else sec[j++] } // 將first陣列中剩餘的元素追加到temp while
(i <= first.size - 1) { temp[t++] = first[i++] } // 將sec陣列中剩餘的元素追加到temp while (j <= sec.size - 1) { temp[t++] = sec[j++] } return temp }

實現二

前面的實現,並未能去除重複的元素,增加題目的要求

  • 合併後的陣列,如果包含相同元素,則只保留一個
fun mergeArray(first: Array<Int>, sec: Array<Int>): Array<Int> {
    val temp = Array(first
.size + sec.size) { 0 } var t = 0 var i = 0 var j = 0 var k: Int // 取較短的陣列開始loop var mid = if (first.size <= sec.size) first.size - 1 else sec.size - 1 while (i <= mid && j <= mid) { //關鍵的邏輯在於這行 k = if (first[i] < sec[j]) first[i++] else sec[j++] //過濾重複元素 if (t > 0 && k == temp[t - 1]) continue temp[t++] = k } // 將first陣列中剩餘的元素追加到temp while (i <= first.size - 1) { k = first[i++] if (t > 0 && k == temp[t - 1]) continue temp[t++] = k } // 將sec陣列中剩餘的元素追加到temp while (j <= sec.size - 1) { k = sec[j++] if (t > 0 && k == temp[t - 1]) continue temp[t++] = k } return temp }

多路合併

以上的數組合並只是兩個陣列,繼續引申出,多個有序陣列進行合併,並去重排序;

相關推薦

merge-sorted-array(合併排序陣列

題目描述 Given two sorted integer arrays A and B, merge B into A as one sorted array. Note: You may assume that A has enough space to hold additio

合併排序陣列

數組合並 實現一 實現二 多路合併 數組合並 條件: 兩個陣列分別已經升序排列 要求: 合併兩個陣列並返回新的已經排序後的陣列 分析該題目,其要求與歸併排序的實現思想相同 歸併排序的演算法中,使用“分治”策略,而這道題的實現

排序陣列二分查詢

劉汝佳 紫書提供方法: //正確答案在[x,y)區間之內,即不會包括y。 //這種方法老是兩個細節搞不順,如下標註 int bsearch(int* a, int x,int y,int test

資料結構演算法題/兩個排序陣列的交集和並集

兩個已排序陣列的交集和並集 問題: 給你兩個排序的陣列,求兩個陣列的交集。 比如: A = 1 3 4 5 7, B = 2 3 5 8 9, 那麼交集就是 3 5. 思路: 1. 每一次從B陣列中取一值,然後在A數組裡逐個比較,如果有相等的,則儲存。該演算法複雜度為 O(MN).

Median of Two Sorted Arrays 求出兩個排序陣列的中位數

題目為: There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run

演算法5:求兩個排序陣列的交集和並集

問題描述 求兩個已排序資料的交集和並集,要求時間複雜度為O(m+n). 解題思路 A陣列和B陣列,A陣列大小為m,B陣列大小為n。 1、查詢B陣列的每個成員是否在A陣列中,時間複雜度為O(mn) 2、由於A和B陣列都是有序陣列,使用二分法查詢B陣列

用O(lgn)時間求出兩個排序陣列的中位數

相關問題: 設 x[1..n]和Y[1..n]為兩個陣列,每個都包含n個已排序的數。給出一個求陣列X和Y中所有2n個元素的中位數的O(lgn)時間的演算法。 思考過程:         開始我想把兩個陣列X與Y放入到一個數組Z中,對Z進行排序,這樣Z的中位數易求。但是有2點

尋找兩個排序陣列的中位數

給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2 。請找出這兩個有序陣列的中位數。要求演算法的時間複雜度為 O(log (m+n)) 。nums1 = [1, 3] nums2 = [2] 中位數是 2.0nums1 = [1, 2] nums2 = [3

二分查詢-兩排序陣列中找中位數二題

第一題來自於《演算法導論》第九章習題 9.3-8. 已知兩個已排序陣列X[n], Y[n](假設升序),問在時間O(lgn)內找到全部2n個數中的中位數。 給了提示時間O(lgn),那麼必定使用二分查詢。這道題的“梗”在於如何處理兩個已排序陣列。我們有總共2n個數,偶數,那

6、合併排序陣列 ||

題目要求: 合併兩個排序的整數陣列甲和乙變成一個新的陣列。 樣例給出A = [1,2,3,4],B = [2,4,5,6],返回[1,2,2,3,4,4,5,6] 挑戰你能否優化你的演算法,如果其中一個數組很大而另一個數組很小?   程式碼實現: 使用向量,和其中的

陣列 ['a','b','d','a','b','c','b','d'] ,按照出現次數排序後變為['b','a','d'

public function test_test() { $arr = ['a','b','d','a','b','c','b','d']; $res = []; foreach ($arr as $k => $v) { $res[$v] = 1; } var_d

leetcode 將排序陣列/連結串列 轉換為二叉搜尋樹(BST),Python實現

思路:不論是陣列還是連結串列,遞迴地找到他的root(即序列的中點),並返回。 1. 將陣列轉換為二叉樹: # Definition for a binary tree node. # class T

LeetCode 21 Merge Two Sorted Lists(合併兩個排序的連結串列)(Linked List)

翻譯 合併兩個排好序的連結串列,並返回這個新連結串列。 新連結串列應該由這兩個連結串列的頭部拼接而成。 原文 Merge two sorted linked lists and return it as a new list. The new

【Lintcode】合併排序陣列&& 合併排序陣列 II

題目描述:合併兩個排序的整數陣列A和B變成一個新的陣列。 注意事項 你可以假設A具有足夠的空間(A陣列的大小大於或等於m+n)去新增B中的元素。 樣例:給出 A = [1, 2, 3, empty, empty], B = [4, 5] 合併之後 A 將

LeetCode 23. Merge k Sorted Lists 合併k個排序的連結串列為一個排序連結串列

Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. Example: Input: [   1->4->5,  

LeetCode 23 Merge k Sorted Lists(合併K個排序連結串列)

翻譯 合併K個已排序的連結串列,並且將其排序並返回。 分析和描述其複雜性。 原文 Merge k sorted linked lists and return it as one sorted list. Analyze and describ

求兩個排序(升序)等長的整數陣列所有元素的中位數

     演算法課的題目,給定兩個整數陣列x[], y[],兩個陣列已被排序(升序),陣列長度都是n,求這2n個數的中位數。      最容易想到的是,新建立以個數組 z[2n],將x[],y[]的所有元素排序放入,然後取中間兩個數,不過當陣列很大時,效率不行啊。<^

LintCode -- 合併排序陣列 II

描述 合併兩個排序的整數陣列A和B變成一個新的陣列。 樣例 給出A=[1,2,3,4],B=[2,4,5,6],返回 [1,2,2,3,4,4,5,6] 挑戰 你能否優化你的演算法,如果其中一個數組很大而另一個數組很小? 原題地址

求兩個排序陣列中所有元素的第K大(小)

1.reference 2.解題思路 以下均假設A[0…m-1],B[0…n-1]; 1)O(n) 假設A,B均以降序排列,宣告兩個指標p,q。p指向A[0], q指向B[0]。再來一個count=0,用來表示當前已經到第count大了。然後指標

合併排序陣列(LintCode)

題目來源:LintCode 原題地址:http://www.lintcode.com/zh-cn/problem/merge-sorted-array-ii/ 題目: 合併兩個排序的整數陣列A和B