代码随想录算法训练营第二天| 977.有序数组的平方 、209.长度最小的子数组、 59.螺旋矩阵II。

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值