#补充昨天双指针内容
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;
}