前言
每日文案:
智者的梦再美,也不如愚人实干的脚印。
一、997.有序数组的平方
题目描述:
给你一个按 非递减顺序 排序的整数数组 nums
,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
题目来源:
1、解题思路(双指针):
我们先观察题目,发现是一个升序的数组,我们要把它平方,再重新排序,因为数组里面是有负数的,我们平分只会大小可能就会改变,比如-100<10,but (-100)*(-100)>10*10,所以我们要想办法先平分再排序。
由于它是有顺序的,我们很显然可以看出,平方之后最大的数只可能在两端出现,因为第一位是最小的(负数最小平分就有可能是最大的),最右边是最大的正数,所以只能是他们两个竞争。
代码如下:
int* sortedSquares(int* nums, int numsSize, int* returnSize) { int k = numsSize-1; int*p = (int*)malloc(sizeof(int) * numsSize); //申请空间 * returnSize=numsSize; //返回数组长度 for (int i = 0, j = numsSize - 1; i <= j;) { if (nums[i] * nums[i] > nums[j] * nums[j]) //两端比较大小,大的入新空间 { p[k] = nums[i] * nums[i]; i++; k--; } else { p[k] = nums[j] * nums[j]; j--; k--; } } return p; }
二、59.螺旋矩阵
题目描述:
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
1.解题思路:
我们先观察矩阵,发现它是一圈一圈地走,从左往右,上往下,右往左,下往上走,数字逐渐递增,属实是回型。那么我们就要想办法设置合适的循环来解这道题了,这里我用了边界法(按我自个的理解来命名哈)。
一入循环深似海,一定要判断好边界!
代码如下:
int** generateMatrix(int n, int* returnSize, int** returnColumnSizes){ *returnColumnSizes=(int *)malloc(sizeof(int)*n); *returnSize=n; //一位长度 int **ans=(int **)malloc(sizeof(int*)*n); //申请二位数组空间 for(int i=0;i<n;i++) { ans[i]=(int *)malloc(sizeof(int)*n); //第二层空间 (*returnColumnSizes)[i] = n; } int l=0,r=n-1,count=1; while(l<r) { for(int j=l;j<=r;j++) //边界往中间夹 { ans[l][j]=count++; } for(int i=l+1;i<=r;i++) { ans[i][r]=count++; } for(int j=r-1;j>=l;j--) { ans[r][j]=count++; } for(int i=r-1;i>=l+1;i--) { ans[i][l]=count++; } l++; r--; } if(n%2!=0) ans[l][r]=n*n; return ans; }
总结
今天是算法训练的第二天,希望每天进步一点点,写得不好的地方,敬请指教。