目录
209. 长度最小的子数组https://leetcode.cn/problems/minimum-size-subarray-sum/
59. 螺旋矩阵 IIhttps://leetcode.cn/problems/spiral-matrix-ii/
209. 长度最小的子数组https://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. 螺旋矩阵 IIhttps://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;
}