歸併排序空間複雜度O(1)的實現
正常的歸併排序是利用分治法,即分解,解決,合併
//O(n)Membery mergeSort
public void mergeSort(int[] nums)
{
int n = nums.length;
helper(nums, 0, n-1);
}
private void helper(int[] nums1,int b, int e)
{
if(b < e)
{
int mid = (b + e) >> 1;
helper(nums1, b, mid);
helper(nums1, mid+1 , e);
merge(nums1, b,mid,e);
}
}
void merge(int[] nums1,int b, int m,int e)
{
int[] nums2 = new int[nums1.length];
int i = b, j = m + 1, k = b;
while(i <= m && j <=e)
{
if(nums1[i] <= nums1[j]){nums2[k++] = nums1[i++];}
else nums2[k++] = nums1[j++];
}
while(i <= m){nums2[k++] = nums1[i++];}
while(j <= e){nums2[k++] = nums1[j++];}
for(int ii = b; ii <=e; ii++)
{
nums1[ii] = nums2[ii];
}
}
顯然利用臨時陣列,空間複雜度為O(N)
倘若在merge操作時,可以只使用O(1)的空間。
答案是可以的!!
首先讓我們熟悉一下旋轉
旋轉:
比如: abcdefg 以d為軸心旋轉,得到efgabcd,可以通過如下演算法實現。
步驟1:對abcd和efg進行reverse ,得到dcba gfe
步驟2:對整體進行reverse,即得到結果 efg abcd
在merge時:
比如:2468 3578 L1:2468 L2:3578,要將L1和L2合併
步驟:
1、確定3在整體中的位置,即在2和4之間。
2、對 468 3進行上述旋轉操作
1、各自reverse 864 3
2、整體reverse 3 468
3、repeat 直至陣列越界。
T(n) = 2T(n/2)+O(2n)
O(nlg2n)
相關推薦
歸併排序空間複雜度O(1)的實現
正常的歸併排序是利用分治法,即分解,解決,合併 //O(n)Membery mergeSort public void mergeSort(int[] nums) { int n = nums.length;
就地歸併排序inplacMergeSort,空間複雜度O(1)
難度在就地歸併:說看程式碼及註釋。與上篇文章有點類似。 //============================================================================ //@lgh原創 //==================
有1,2,....一直到n的無序陣列,求排序演算法,要求時間複雜度為O(n),空間複雜度O(1)
http://blog.csdn.net/dazhong159/article/details/7921527 1、有1,2,....一直到n的無序陣列,求排序演算法,並且要求時間複雜度為O(n),空間複雜度O(1),使用交換,而且一次只能交換兩個數。 #include &
資料結構演算法題/字串按照單詞翻轉要求空間複雜度O(1)
/** * 先直接逆序,這樣確保最後那個單詞在前面了,只不過此時單詞是逆序的 * 然後再對每個逆序的單詞進行調整 */ public class StringWordReverse { public String wordReverse(String str){ //在
Morris遍歷詳解——二叉樹先序中序後序遍歷( 時間複雜度O(N),空間複雜度O(1) )
Morris二叉樹遍歷: 來到當前的節點:Cur 如果Cur無左孩子,Cur向右移動 (Cur = Cur.right) 如果Cur有左孩子,找到Cur左子樹上最右的節點,記為 mostright
陣列中只出現一次的數字,時間複雜度O(n),空間複雜度O(1)的解法
題目:一個整型數組裡除了兩個陣列外,其他的數字都出現了兩次,要找出這兩個數字。 異或運算有一個性質:任何數異或它自己,結果都是0;這樣如果題目變成只有一個數字只出現一次,其他數字均出現兩次,這樣我們從頭到尾異或陣列中的每一個數字,那麼最終的結果就是隻出現一次的數字
單鏈表反轉,要求空間複雜度O(1)
這是一道筆試題: 給你一個指向單鏈表表頭的指標,要你把整個連結串列反轉,並且空間複雜度為O(1),最後返回指向新的連結串列頭的指標。連結串列節點結構和函式頭已給出: struct L
原地歸併演算法(空間複雜度為O(1)的歸併排序)
歸併排序演算法(mergesort)是將一個序列劃分為同樣大小的兩個子序列,然後對兩個子序列分別進行排序,最後進行合併操作,將兩個子序列合成有序的序列.在合成的過程中,一般的實現都需要開闢一塊與原序列大小相同的空間,以進行合併操作,歸併排序演算法的示例在這裡.
棧排序(空間複雜度O(1))
如果要將空間複雜度為O(1),那麼就不能夠宣告陣列來申請空間了 只有兩個堆疊可以使用。 那麼我們該怎麼去實現排序了,因為堆疊是後進先出,只有一端能進入和出去,這就使得問題複雜了。 其實我們可以不再另申請空間也能完成排序。 比如,一個輸出棧S,輸入棧R,我們每次將輸入棧
查詢陣列中重複的唯一元素+時間複雜度O(n)+空間複雜度O(1)
這是我BIGO前端面試時,面試官給我出的一道題,題目是長度為N的陣列,元素大小範圍在[1,N-1],只有一個重複的元素,用O(n)的時間複雜度和O(1)的空間複雜度找出來這個重複的元素, 大致思路 1、因為總共有N個數,每個數的範圍是1到N-1,只有一個重複的數,所以這些數肯定是連續的 2
動態規劃演算法(連續子陣列最大和,O(N)時間複雜度O(1)空間複雜度) 【更新於:2018-05-13】
這個題目最早在13年阿里筆試出現,直到前兩天面試另一家電商又出現,哎,欠的都是要還的。 這個問題的思路如下:一維陣列的下標連續的元素構成連續子陣列,求所有連續子陣列中和最大的那個子陣列。 解析:2018-11-08 1 首先這個問題要轉化為Q(n)的問題,對於Q(n)的
java實現時間複雜度O(1)的LFU快取
LFU快取一般需要排序來解決命中率問題(上一篇的LFU實現也是利用了Collections.sort),導致時間複雜度較高。下面採用一種演算法讓LFU的時間複雜度成為O(1)。 資料設計: 1,一個雙向連結串列來儲存命中數(下面程式碼的NodeCount<K>
51-【巧解】統計無序陣列各元素出現的次數--時間複雜度O(n),空間複雜度O(1)
一、問題描述 【題型一】 一個長度大小為n的陣列,陣列中的每個元素的取值範圍在[1,n],且為正整數。 問:如何在時間複雜度為O(n),空間複雜度為O(1)的條件下,統計陣列中不同元素出現的次數。 【題型二】 在一個長度為n的數組裡的所有數字都在0-n-1的範圍內。陣
面試中關於HashMap的時間複雜度O(1)的思考
今天在面試的時候說到HashMap,面試官問了這麼一個問題:你說HashMap的get迭代了一個連結串列,那怎麼保證HashMap的時間複雜度O(1)?連結串列的查詢的時間複雜度又是多少? 在這之前我是閱讀過HashMap的原始碼的:Java7原始碼淺析——對HashMap的理解
Python返回列表中的top5,時間複雜度O(1)
Python返回列表中的top5,時間複雜度O(1) 有同學可能想了,我用sort排序一下,再返回不就好了。 那有沒有別的解決辦法呢? # 題目:長度10W的列表,返回top5的數。 # 要求:時間複雜度O(1) # # 解題思路: # 用列表模擬棧,遍歷列表; # 定義一個長度為5
陣列去重(時間複雜度nlgn,時間複雜度o(1))
public static void quickSort(int[] numArr, int left, int right) { //如果left等於right,即陣列只有一個元素,直接返回 if (left >= right) { return;
快排和歸併排序的複雜度相同,為什麼都用快排而不用歸排?
快排和歸排的複雜度都是O(n*log n),為什麼都用快排而不用歸排? 看了《演算法圖解》之後,大致理解了是什麼原因,真正的原因是:不可描述的常量導致使用快排而不是歸排。 好了,真正的解釋是這樣的: 演算法的每一步實際上都需要一個固定時間量,被稱為常量。我們平時考慮時間複雜度的時候並
演算法分析:時間複雜度+空間複雜度 O(n)
時間複雜度演算法分析同一問題可用不同演算法解決,而一個演算法的質量優劣將影響到演算法乃至程式的效率.演算法分析的目的在於選擇合適演算法和改進演算法.一個演算法的評價主要從時間複雜度和空間複雜度來考慮.1、時間複雜度(1)時間頻度一個演算法執行所耗費的時間,從理論上是不能算出來
老王帶你理解演算法複雜度O(1),O(N),O(N^2)
上圖對應的是演算法複雜度的圖片,X軸對應的是n(問題規模),Y軸對應的是執行的執行時間。 我們先從簡單的複雜度解讀O(1) 從上面的圖片我們可以看到O(1)的複雜度是恆定的,一點波瀾都沒有,什麼是O(1)呢,就比如你是一個酒店的管理員,你負責管理酒店的鑰匙,你很聰
歸併排序時間複雜度----主定理
http://blog.csdn.net/touch_2011/article/details/6785881 1、序言 2、歸併排序 2.1 引出 歸併排序又是另一類排序演算法,它是一種基於“分治”策略的一種演算法。歸