977.有序数组的平方
题目链接:977. 有序数组的平方 - 力扣(LeetCode)
不难的一道题,我的解法是最常用的两个for循环遍历,时间复杂度是O(n²),没有考虑到数组值是按照非递减顺序排序的,有更简单的方法,老师的双指针解法非常有意思,这是第二次遇到了。
/**
* Note: The returned array must be malloced, assume caller calls free().
我的解法
*/
int* sortedSquares(int* nums, int numsSize, int* returnSize){
int i, j, tmp;
int *result = NULL;
*returnSize = numsSize;
result = (int *)malloc(sizeof(int) *numsSize);
for(i = 0; i < numsSize; i++)
{
result[i] = nums[i]*nums[i];
}
for(i = 0; i < numsSize; i++)
{
for(j = i+1; j < numsSize; j++)
{
if(result[i] > result[j])
{
tmp = result[i];
result[i] = result[j];
result[j] = tmp;
}
}
}
return result;
}
209.长度最小的子数组
题目链接:209. 长度最小的子数组 - 力扣(LeetCode)
用到了滑动窗口,其实和双指针有异曲同工之妙,“滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置”,需要确认3点:窗口是什么、窗口的起始位置、窗口的结束位置。
“窗口就是 满足其和 ≥ s 的长度最小的连续子数组。”
我的理解是窗口的结束位置相当于游标,负责遍历数值加和,起始位置负责在满足加和 ≥ s时结束遍历,并往回缩小数组范围,精华就在起始位置的确认,是数组最小长度计算的关键点。
不明白的地方在于初始化最小长度为INT_MAX,这不是一个具体的值,为什么不能直接用numsSize来判断。
其中还涉及到了时间复杂度和空间复杂度的计算,暂时先不看了,先学习算法。
以后要认真读题避免误解。
int minSubArrayLen(int target,int* nums,int numsSize)
{
//初始化最小长度为INT_MAX
int minLength = INT_MAX;
int sum =0;
int left =0, right =0;//右边界向右扩展
for(; right < numsSize;++right){
sum += nums[right];//当sum的值大于等于target时,保存长度,并且收缩左边界
while(sum >= target){
int subLength = right - left +1;
minLength = minLength < subLength ? minLength : subLength;
sum -= nums[left++];
}
}
//若minLength不为INT_MAX,则返回minLnegth
return minLength == INT_MAX ?0: minLength;}
/* 我的暴力解法,直接用numsSize做比较获取最小长度*/
int minSubArrayLen(int target, int* nums, int numsSize){
int i, j, sum, length, minlength,flag=0;
minlength = numsSize;
for(i = 0; i < numsSize; i++)
{
sum = 0;
for(j = i; j < numsSize; j++)
{
sum += nums[j];
if(sum >= target)
{
length = j-i+1;
minlength = minlength<length?minlength:length;
flag = 1; /*标记位flag用来判断是否存在符合条件的子数组,等于1表示存在,返回最小长度,等于0表示不存在,返回0*/
}
}
}
return (0==flag)?0:minlength;
}