文章目录
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;
}