[88].合併兩個有序數組

 


題目

給你兩個有序整數數組 nums1nums1nums2nums2,請你將 nums2nums2 合併到 nums1nums1 中,使 nums1nums1 成爲一個有序數組。

示例:

輸入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6],       n = 3

輸出: [1,2,2,3,5,6]

說明:

  • 初始化 nums1nums1nums2nums2 的元素數量分別爲 mmnn
  • 你可以假設 nums1nums1 有足夠的空間(空間大小大於或等於 m+nm + n)來保存 nums2nums2 中的元素

 


函數原型

C 的函數原型:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){}

 


邊界判斷

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){}

 


算法設計:雙指針

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
	int i, j, k;
	i = j = k = 0;
	int *nums = calloc(nums1Size, sizeof(int));
	
	while( (i < m) && (j < n) ){
		if( nums1[i] < nums2[j] )
			nums[k++] = nums1[i++];
		else
			nums[k++] = nums2[j++];
	}

	while( i < m )
		nums[k++] = nums1[i++];
	while( j < n )
		nums[k++] = nums2[j++];
		
	for(int i=0; i<nums1Size; i++)
        nums1[i] = nums[i];
	
	free(nums), nums = NULL;
}
  • 時間複雜度:Θ(n+m)\Theta(n+m)
  • 空間複雜度:Θ(m)\Theta(m)

 


算法設計:雙指針

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
    int i, j, k;
    for( i = m-1, j = n-1, k = m+n-1; (i >= 0 && j >= 0);  (k--) )
        (nums1[i] > nums2[j]) ? (nums1[k] = nums1[i--]) : (nums1[k] = nums2[j--]);

    while( j >= 0 )
        nums1[k--] = nums2[j--];
}
  • 時間複雜度:Θ(n+m)\Theta(n+m)
  • 空間複雜度:Θ(1)\Theta(1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章