有序数组的平方
//双指针
//最大值只会在数组两头取得→双指针
//i=j的元素也要取→i<=j
//要求升序→k=numsize-1 从右向左赋值
int* sortedSquares(int* nums, int numsSize, int* returnSize) {
*returnSize=numsSize;//注意给新数组赋值长度
int * result=(int*)malloc(sizeof(int)*numsSize);//申请数组空间;要用指针,不然会在弹栈时销毁
int i=0,j=numsSize-1,k=numsSize-1;
for(;i<=j;){
if((nums[i]*nums[i])>=(nums[j]*nums[j])){
result[k--]=nums[i]*nums[i];
i++;
}
else{
result[k--]=nums[j]*nums[j];
j--;
}
}
209 长度最小的子数组
//滑动窗口
int minSubArrayLen(int target, int* nums, int numsSize) {
int minL=INT_MAX;
int sum=0;
int i=0;
int j=0;
for(;j<numsSize;j++){//j为终止位置,不然和两层循环暴力解无区别
sum +=nums[j];
while(sum>=target){//必须用while而不能用if,因为i移动一次,sum可能依旧大于等于target
int curL=j-i+1;//当前子数组长度
minL=minL>curL?curL:minL;//更新最小子数组长度
sum -=nums[i++];
}
}
//if(j==numsSize&&sum<target) return 0; 此为错误判断条件 因为sum会在下面-- 故sum必小于target;此条件亦
// 不可放在for循环内部,因为j==numsSize 无法进入for循环
if(minL==INT_MAX) return 0;
return minL;
}
螺旋矩阵
int** generateMatrix(int n, int* returnSize, int** returnColumnSizes) {
//二维数组空间申请
*returnSize = n;
*returnColumnSizes = (int*)malloc(sizeof(int) * n);
int** ans = (int**)malloc(sizeof(int*) * n);
int i;
for(i = 0; i < n; i++) {
ans[i] = (int*)malloc(sizeof(int) * n);
(*returnColumnSizes)[i] = n;
}
int x=0,y=0,mid=n/2,loop=n/2,ofs=1,count=1;//x,y为每次起始坐标;mid为中心点;loop为旋转圈数;ofs为偏移量;count为赋值数据
while(loop){//共旋转n/2圈
int i=x,j=y;
for(;j<n-ofs;j++){//从左到右
ans[x][j]=count++;
}
for(;i<n-ofs;i++){//从上到下
ans[i][j]=count++;
}
for(;j>y;j--){//从右到左
ans[i][j]=count++;
}
for(;i>x;i--){//从下到上
ans[i][j]=count++;
}
//更新
x++;
y++;
ofs++;
loop--;//莫忘
}
if(n%2){//n为奇数则中心点单独赋值
ans[mid][mid]=count;
}
return ans;
}