暴力解法
插入排序
void square(int* nums, int numsSize){
for(int i = 0; i < numsSize; i++)
nums[i]*=nums[i];
}
void insertSort(int* nums, int numsSize){
int i;
int p;
int temp;
for(i = 1; i < numsSize; i++){
temp = nums[i];
for(p = i;p > 0 && nums[p-1] > temp; p--)
nums[p] = nums[p-1];
nums[p] = temp;
}
}
int* sortedSquares(int* nums, int numsSize, int* returnSize) {
square(nums, numsSize);
insertSort(nums, numsSize);
*returnSize = numsSize;
int* ans=(int*)malloc(sizeof(int)*numsSize);
for(int i = 0; i < numsSize; i++)
ans[i] = nums[i];
return ans;
}
双指针
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* sortedSquares(int* nums, int numsSize, int* returnSize) {
*returnSize = numsSize;
int left = 0;
int right = numsSize - 1;
int*ans = (int*)malloc(sizeof(int)*numsSize);
int index;
for( index = numsSize-1; index >= 0; index--){
int lsquare = nums[left]*nums[left];
int rsquare = nums[right]*nums[right];
if(lsquare > rsquare)
{
ans[index] = lsquare;
left++;
}
else
{
ans[index] = rsquare;
right--;
}
}
return ans;
}
总结:如何使用双指针是看题目的需求,这道题用双指针的思路和归并排序的思路相类似。
int minSubArrayLen(int target, int* nums, int numsSize) {
int minlength = INT_MAX;
int sum = 0;
int left = 0;
int right = 0;
for(; right < numsSize; right++){
sum+=nums[right];
while(sum >= target)
{
int SubLength = right - left + 1;
minlength=minlength < SubLength ? minlength: SubLength;
sum-= nums[left++];
}
}
return minlength == INT_MAX ? 0 : minlength;
}
我的错误:想将所有的长度放在一个数组里,然后再进行比较,而且没有完全将所有的可能考虑到。对c语言还不是很熟练
总结:滑动窗口中,要考虑滑动窗口是如何移动的。看到最大值,可以使用动态变化,可以使用三元表示法,最值初始化时,可以使用头文件带的最值。
题目链接59. 螺旋矩阵 II - 力扣(LeetCode)
int** generateMatrix(int n, int* returnSize, int** returnColumnSizes){
//初始化返回的结果数组的大小
*returnSize = n;
*returnColumnSizes = (int*)malloc(sizeof(int) * n);
//初始化返回结果数组ans
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 startX = 0;
int startY = 0;
//设置二维数组的中间值,若n为奇数。需要最后在中间填入数字
int mid = n / 2;
//循环圈数
int loop = n / 2;
//偏移数
int offset = 1;
//当前要添加的元素
int count = 1;
while(loop) {
int i = startX;
int j = startY;
//模拟上侧从左到右
for(; j < n - offset; j++) {
ans[startX][j] = count++;
}
//模拟右侧从上到下
for(; i < n - offset; i++) {
ans[i][j] = count++;
}
//模拟下侧从右到左
for(; j > startY; j--) {
ans[i][j] = count++;
}
//模拟左侧从下到上
for(; i > startX; i--) {
ans[i][j] = count++;
}
//偏移值每次加2
offset+=1;
//遍历起始位置每次+1
startX++;
startY++;
loop--;
}
//若n为奇数需要单独给矩阵中间赋值
if(n%2)
ans[mid][mid] = count;
return ans;
}
总结:螺旋矩阵最重要的就是区间的选择。