代码随想录算法训练营第二天| 977.有序数组的平方、209.长度最小的子数组、59. 螺旋矩阵 II

#补充昨天双指针内容

1.题目:给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

/**

 * Note: The returned array must be malloced, assume caller calls free().

 */

#这里声明新数组时需要使用malloc

int* sortedSquares(int* nums, int numsSize, int* returnSize) {

    int k = numsSize-1; //新数组的大小

    int* array = (int*)malloc(numsSize * sizeof(int));

// 由于非递减顺序并且可能含有负数,(两边平方后的数大)所以需要首尾指针

    int left = 0; 

    int right = numsSize - 1;

// 仅需判断首尾指针是否越界即可

    while(left <= right){

        if (nums[left]*nums[left] > nums[right]*nums[right]){

            array[k--] = nums[left]*nums[left];

            left++;

        }

        else{

            array[k--] = nums[right]*nums[right];

            right--;

        }

    }

    *returnSize = numsSize; //c语言特性,原因在于告知调用者返回的数组中有效元素的数量

    return array;

}

总结:双指针不仅局限与快慢指针,也可以首尾指针

2.题目:给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度如果不存在符合条件的子数组,返回 0 。

## 双指针第三种类型,属于线性优化类型

## 代码中首先需要定义最大最小的函数用来判断两个数大小比较,其次定义最大值以初始化变量

#define max(a,b) (((a) > (b)) ? (a) : (b))

#define min(a,b) (((a) < (b)) ? (a) : (b))

#define MAX INT_MAX

int minSubArrayLen(int target, int* nums, int numsSize) {

    int left = 0;

    int right = 0;

    int sum = 0; //求和变量,统计子数组的和

    int result = MAX; //标记最终子数组的大小

## 这里思想是通过遍历子数组右侧下标,在遍历的同时找到大于等于target的最大的子数组,之后通过左下标进行缩小范围,最终确定最小子数组。

    for (right; right < numsSize; right++){ //相当于子数组的右侧进行数组顺序遍历

        sum+=nums[right]; //先找出大于等于target的子数组

        while(sum >= target){

            int subl = right - left + 1; //子数组的大小

            result = min(result, subl);

            sum -= nums[left];

            left++;

        }

    }

    return result == MAX ? 0: result;

}

3.题目:给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

## 今天题目在c语言指针这里卡了很久,正在复习c++之后进行重写,解析的话很简单不赘述了

/**

 * Return an array of arrays of size *returnSize.

 * The sizes of the arrays are returned as *returnColumnSizes array.

 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().

 */

int** generateMatrix(int n, int* returnSize, int** returnColumnSizes) {

    *returnSize = n;

    *returnColumnSizes = (int**)malloc(sizeof(int*) * n);

    int i;

    for (i = 0; i < n; i++) {

        (*returnColumnSizes)[i] = n; // 正确设置每一列的大小

    }

    int** ans = (int**)malloc(sizeof(int*) * n);

    for (i = 0; i < n; i++) {

        ans[i] = (int*)malloc(sizeof(int) * n);

    }

    int x = 0;

    int y = 0;

    int mid = n/2;

    int loop = n/2;

    int offset = 1;

    int count = 1;

    while(loop){

        int i = x;

        int j = y;

        for(; j < y+n-offset; j++){

            ans[x][j] = count++;

        }

        for(; i < x+n-offset; i++){

            ans[i][j] = count++;

        }

        for(; j > x; j--){

            ans[i][j] = count++;

        }

        for(; i > x; i--){

            ans[i][j] = count++;

        }

        offset+=2;

        x++;

        y++;

        loop--;

    }

    if(n%2)

        ans[mid][mid] = count;

    return ans;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值