算法刷题 DAY2

有序数组的平方

//双指针

//最大值只会在数组两头取得→双指针
//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=target){//必须用while而不能用if,因为i移动一次,sum可能依旧大于等于target
int curL=j-i+1;//当前子数组长度
minL=minL>curL?curL:minL;//更新最小子数组长度
sum -=nums[i++];
}
}
//if(j==numsSize&&sum

螺旋矩阵

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(;jy;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;
}

你可能感兴趣的:(算法,数据结构,c语言)