每日算法4/4

目录

209. 长度最小的子数组https://leetcode.cn/problems/minimum-size-subarray-sum/

题目

滑动窗口

思路

LeetCode代码答案-C语言

59. 螺旋矩阵 IIhttps://leetcode.cn/problems/spiral-matrix-ii/

题目

思路

接口讲解

 LeetCode代码答案-C语言


 

209. 长度最小的子数组icon-default.png?t=N7T8https://leetcode.cn/problems/minimum-size-subarray-sum/

题目

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其总和大于等于 target 的长度最小的 连续

子数组

 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度如果不存在符合条件的子数组,返回 0 。

示例 1:

输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。

示例 2:

输入:target = 4, nums = [1,4,4]
输出:1

示例 3:

输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

提示:

  • 1 <= target <= 109
  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 105

滑动窗口

时间复杂度:O(N)

  • 就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果
  • 只用一个for循环,这个循环的索引,一定是表示 滑动窗口的终止位置

思路

普通的暴力解法的时间复杂度时O(N^2),如果采用滑动窗口那么时间复杂度是O(N)

首先通过终止指针遍历得到元素之和,得到一组元素满足元素之和>=目标值的子数组,并记录下此时的长度,通过动态最小化记录最小子数组的长度,然后缩小左界限,如果仍然满足元素之和>=目标值,那么继续缩小子数组的左界限并记录。如果不满足了就移动右界限,再同之前一样缩小左界限。

LeetCode代码答案-C语言

int minSubArrayLen(int target, int* nums, int numsSize) {
    int sum = 0;
    int ret = INT_MAX;//INT_MAX是<limits.h>定义的一个预处理器符号
                      //表示整数型int能够表示的最大正值
    int subL = 0;
    int i = 0;
    for(int j = 0 ; j < numsSize ; j++){
        sum += nums[j];
        while(sum >= target){
            subL = j - i + 1;
            ret = ret < subL ? ret : subL;
            sum-=nums[i++];
        }

    }
    return ret == INT_MAX ? 0 : ret;//如果遍历完整个数组都没有找到符合条件的子数组
                                    //通过ret == INT_MAX ? 0 : ret判断是否找到
                                    //如果没有找到,ret仍然是INT_MAX,此时返回0
                                    //反之返回子数组最短长度
}

59. 螺旋矩阵 IIicon-default.png?t=N7T8https://leetcode.cn/problems/spiral-matrix-ii/

题目

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

示例 1:

输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

示例 2:

输入:n = 1
输出:[[1]]

提示:

  • 1 <= n <= 20

思路

主要思想是遵循循环不变量原则

  • 首先从题目知道由螺旋形状输入数组元素,那么先分析最外面一层,需要两个坐标分别标输入的起始行和列,并且可以找到这个螺旋矩阵的一个输入汇率,是每一行每一列左闭右开的输入会形成一个规律(我们就找到了循环不变量的不变量,即输入方式是左闭右开)。
  • 那么有了行列的起始坐标,还需要一个每一次循环输入行列的终止位置,但由于是左闭右开的所以终止位置不输入,下一次起始位置即上一次的终止位置
  • 以上是一圈中前两次循环输入
  • 剩下两次循环输入是由终止位置走向(行或列)的起始位置,循环条件会发生变化,走到起始位置时结束输入。
  • 以上是一圈的输入,要进入下一圈的话,行列的起始位置,终止位置都会发生改变。终止位置回到退1,行列的起始位置会进1,然后同上进行一圈的循环输入。直到圈数走完。
  • 但圈数因为n的奇偶而不一样,所以最后还需要判断是否是奇数,如果是奇数,还需要输入中间的那个数组元素。

接口讲解

  • int* returnSize:返回值,用于存储生成矩阵中元素的数量
  • int** returnColumnSizes:返回值,用于存储么一列元素的数量,以数组形式返回(所以需要malloc分配空间)

 LeetCode代码答案-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) {
    int startx = 0;
    int starty = 0;
    int count = 1;
    int offset = n-1;//3
    *returnColumnSizes = (int*)malloc(sizeof(int) * n);
    *returnSize = n;
    int **nums = (int**)malloc(sizeof(int*) * n);
    for(int i = 0; i < n; i++) {
        nums[i] = (int*)malloc(sizeof(int) * n);//nums是一个指针数组
                        //其中每一个元素是num[],都是指向一维数组数组的指针
                        //代表矩阵的每一列。循环内部,为么每一列分配了空间。
        (*returnColumnSizes)[i] = n;为了返回一个数组,其中每个元素表示对应列中元素的数量
    }

    int loop = n/2;
    while(loop){
        int j = starty;
        int i = startx;
        for(;j < offset ; j++)
            nums[i][j] = count++;
        for(;i < offset ; i++)
            nums[i][j] = count++;
        for(;j > starty ; j--)
            nums[i][j] = count++;
        for(;i > startx ; i--)
            nums[i][j] = count++;
        offset--;
        startx++;
        starty++;
        loop--;
    }
    if(n%2 != 0)
        nums[n/2][n/2] = count;
    return nums;
}

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值