88.合併兩個有序數組
題目描述
給定兩個有序整數數組 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成爲一個有序數組。
說明:
- 初始化 nums1 和 nums2 的元素數量分別爲 m 和 n。
- 你可以假設 nums1 有足夠的空間(空間大小大於或等於 m + n)來保存 nums2 中的元素。
示例:
輸入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
輸出: [1,2,2,3,5,6]
解題方法
常規方法,
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n)
{
int t = 0, j = 0;
for (int i = 0; i < n ; i ++) // 逐個比較
{
while ((nums2[i] > nums1[t]) && t < m+i) // 確定插入位置
t ++;
for (j = m + i; j > t; j--) // 移動元素
nums1[j] = nums1[j-1];
nums1[t] = nums2[i];
}
}
107.二叉樹的層次遍歷
題目描述
給定一個二叉樹,返回其節點值自底向上的層次遍歷。 (即按從葉子節點所在層到根節點所在的層,逐層從左向右遍歷)
例如:
給定二叉樹 [3,9,20,null,null,15,7],
解題方法
來自題解
void visitTree( struct TreeNode * root , int depth , int * buffer , int * returnSize , int * len )
{
if( *returnSize < depth + 1 )
*returnSize = depth + 1;
if( root -> left != NULL )
visitTree( root -> left , depth + 1 , buffer , returnSize , len );
if( root -> right != NULL )
visitTree( root -> right , depth + 1 , buffer , returnSize , len );
*( buffer + *len ) = root -> val;
*( buffer + *len + 1 ) = depth;
*len += 2;
}
int ** levelOrderBottom( struct TreeNode * root , int * returnSize , int ** returnColumnSizes )
{
*returnSize = 0;
if( root == NULL )
return NULL;
int * buffer = ( int * )malloc( sizeof( int ) * 1024 * 2 );
int len = 0;
visitTree( root , 0 , buffer , returnSize , &len );
int ** data = ( int ** )malloc( sizeof( int * ) * ( *returnSize ) );
*( returnColumnSizes + 0 ) = ( int * )malloc( sizeof( int ) * ( *returnSize ) );
for( int i = 0 ; i < *returnSize ; i++ )
{
*( *( returnColumnSizes + 0 ) + i ) = 0;
*( data + i ) = ( int * )malloc( sizeof( int ) * len );
}
for( int i = 0 ; i < len ; i += 2 )
{
int row = *returnSize - *( buffer + i + 1 ) - 1;
*( *( data + row ) + *( *( returnColumnSizes + 0 ) + row ) ) = *( buffer + i );
*( *( returnColumnSizes + 0 ) + row ) += 1;
}
free( buffer );
return data;
}