ML-czy的小组任务4

1.将一维数组转化为二维数组:
链接: 题目链接
ML-czy的小组任务4_第1张图片
这道题其实就是按要求将数组元素存储,首先保证给出的行与列与原数组元素相等,不等则将返回值为零,相等就通过循环将数据存储进新数组,不过力扣数组相关的题需要进行开辟内存空间的操作,这里具体看代码解释:

int** construct2DArray(int* original, int originalSize, int m, int n, int* returnSize, int** returnColumnSizes){
    int **arr;
    if((m * n)!=originalSize)
    {
        *returnSize=0;//返回值定为零
        return arr;//空数组
    }
    int i,j,index=0;//index主要是让原数组进行遍历
    *returnSize = m;//返回行数
    *returnColumnSizes = (int*)malloc(sizeof(int) * m);
    arr = (int **)malloc(sizeof(int *)*m);//开辟数组列空间
    for(i=0;i<m;i++)
    {
        (*returnColumnSizes)[i] = n;//力扣写法,列的大小表示
        arr[i] = (int*)malloc(sizeof(int) * n);//一维数组开辟空间
        for(j=0;j<n;j++)
        {
            arr[i][j] = original[index++];
        }
    }
    return arr;
}

2.多个数组求交集:
链接: 题目链接
ML-czy的小组任务4_第2张图片
这道题就是在多维数组中找元素相同的放在新数组里,比如在二维数组中的元素就是一维数组,所以有这样一个思路,可以先统计出二维数组中每个元素出现的次数,如果与其长度相等的话就说明二维数组中每个元素都存在它,代码如下:

int* intersection(int** nums, int numsSize, int* numsColSize, int* returnSize){
    int arr[1001]={0};
    int *ins = (int*)malloc(sizeof(int)*1001);//这里我试了1001可以ac,像901就过不了
    int i,j,index=0;
    for(i=0;i<numsSize;i++)
    {
        for(j=0;j<numsColSize[i];j++)//列的大小表示
        {
            arr[nums[i][j]]++;//这里统计二维数组中每个元素出现次数
        }
    }
    for(i=0;i<1001;i++)
    {
        if(arr[i]==numsSize)//与二维数组大小相等的就满足条件
        {
            ins[index++]=i;//存进新数组中
        }
    }
    *returnSize = index;//返回新数组长度
    return ins;
}

3.移除链表元素:
链接: 题目链接
ML-czy的小组任务4_第3张图片
这道题与普通的删除节点数据不一样,因为假如有两个结点需要删除,普通的方法只会删除一个结点数据,所以这次可以采用递归或递推的方法去解决,代码如下:

//递归法:
struct ListNode* removeElements(struct ListNode* head, int val){ 
    if (head == NULL) 
    {
        return head;
    }     
    head->next = removeElements(head->next, val);//直接将 removeElements(head->next, val) 的结果存放到 head->next 中,再判断 head->val 是否等于 val。
    return head->val == val ? head->next : head;
}
//迭代法:
struct ListNode* removeElements(struct ListNode* head, int val){
    while (head != NULL && head->val == val) {
        head = head->next;//当只有一个数据时
    }

    if (head == NULL) {
        return head;
    }

    struct ListNode* p = head;
    while (p->next != NULL) {
        if (p->next->val == val) {
            p->next = p->next->next;   //删除结点值为val的结点
        } else {
            p = p->next;//遍历
        }
    }
    return head;
}

4.二叉树展开为链表:
链接: 题目链接
ML-czy的小组任务4_第4张图片
这道题根据题目描述,二叉树的先序遍历,先访问根结点,然后由左子树到右子树遍历就好,代码如下:

void flatten(struct TreeNode* root){
    if(root){
        struct TreeNode* rightChild = root -> right;
        flatten(root -> left);
        root -> right = root -> left;//把左子树结点放在右子树上
        root -> left = NULL;//把左子树结点置空
        while(root -> right){
            root = root -> right;
        }
        flatten(rightChild);
        root -> right = rightChild;
    }
}

你可能感兴趣的:(算法题整理,链表,数据结构)