合併N個長度為M的有序陣列為乙個N M的有序陣列

2022-03-09 16:19:19 字數 983 閱讀 6879

題目:合併n個有序陣列,每個陣列的長度為m,合併為n*m的有序陣列。時間複雜度要求最低

解法:n個陣列進行兩兩合併,合併後的陣列再繼續執行合併過程,最後合成n*m的有序陣列。可以認為合併這個遞迴過程發生了logn次,每一次合併的過程都是n*m個數合併,所以每一次合併的時間複雜度為n*m,總的時間複雜度就是n*m*logn

**如下:

public

class

mergearrays , , , };

for (int

num : mergearrays(nums))

}//將n個陣列合併為乙個陣列

public

static

int mergearrays(int

nums)

//兩兩合併陣列

public

static

int merge(int

nums)

if (nums.length == 1)

int rows = nums.length / 2;

//兩兩合併後的新陣列

int result = new

int[rows];

for (int i = 0; i < nums.length; i += 2)

return

merge(result);

}//具體對兩個陣列進行合併,成為乙個新陣列

public

static

int mergetwoarray(int nums1, int

nums2)

else

}while (p1

while (p2

return

helper;}}

執行結果如下:

合併N個長度為L的有序陣列為乙個有序陣列

方案一 新建乙個n l的陣列,將原始陣列拼接存放在這個大陣列中,再呼叫arrays.sort 進行排序,或者使用其它排序方法即可。其實這個題與合併鍊錶很像,但是如果沒有指定每個陣列的長度,做起來就不太方便,所以一般的前提就是陣列長度是一致的 class solution int col array ...

長度為n無序陣列找屎

假定這個n的長度為特別大 1 找乙個最小數 2.找乙個最大數和乙個最小數 最笨的方法排序 取最大值,和最小值,所需時間為n2 傻子的辦法 比較法 存兩個臨時變數 第乙個臨時變數,一直儲存最小的值,遍歷陣列,遇見比它小的進行交換,複雜度一直為n 另乙個臨時變數,則儲存最大值 聰明點的人 兩兩比較法 第...

面試or筆試4 合併兩個有序陣列為乙個有序陣列

合併兩個有序的陣列,合併之後的陣列也要有序 解題思路 類似合併鍊錶,兩個指標,分別指向乙個陣列的頭位置,比較哪乙個大就將哪乙個插入新陣列並把該指標後移一位 include includeusing namespace std vectormerge vectors vector v1,vector ...