代码随想录算法训练营第二天 | LeetCode977有序数组的平方、LeetCode209滑动窗口、LeetCode59螺旋矩阵

有序数组的平方:

暴力解法:平方后重新排序,时间复杂度O(n*logn)

双指针解法(建立在有序数组的基础之上):

1.新数组的下标由大到小更新,这样保证新数组由小到大排列

2.i<=j的原因:当i,j指针同时指向一个元素(i=j)时,也将其更新在新的数组内

3.用if else语句,nums[i]=nums[j]的情况既可以把result[]更新到nums[i]

问:

Q1:暴力解法时间复杂度??

Q2:while更好理解?

下面是自己写的,运行结果不对

#include<stdio.h>

int sqr(int* num, int size)

{

    int i = 0, j = size - 1, k = size - 1;

    while (i <= j) {

        if (num[i] * num[i] < num[j] * num[j]) {

           num[k] = num[j] * num[j];

           k--;

           j--;

        }

        else {

           num[k] = num[i] * num[i];

           k--;

           i++;

        }

    }

    return k;

}

int main()

{

    int num[] = { -15,5,7,12,14 };

    int size = 5;

    int a = sqr(num, size);

    int i;

    for (i = 0; i < size; i++) {

        printf("%d,%d\n", i, num[i]);

    }

    return 0;

}

滑动窗口:

 暴力解法:超时

双指针:

注意事项:

1.写while而不写if,因为写if的话只会执行一次i指针的向右移动,但如果向右移动一次i指针后仍然符合数组和≥s,则还要移动i指针,此时就需要while

2.建立在有序排列的基础上

3.result的初始值为MAX,这样才能和subL比较持续更新result的值

4.一开始的for循环里面的j指针属于右指针,j=0;j<numSize;j++

5.下图第13行:给minLength赋值,用等号;第18行:进行判断,用双等号

问题:

1.时间复杂度O(n)??

9b701abaece74e1f93fb8b26ce1fdfc0.jpg

下面是自己写的,仍然运行结果仍然错误,明天回来debug

#include<stdio.h>

int Leet(int num[], int size, int s)

{

    int minL = size;

    int i = 0, j = 0;

    int sum = 0;

    while (j < size)

    {

        int k = i;

        if (k <= j) {

           for (; k <= j; k++) {

               sum += num[k];

           }

        }

        else sum = 0;

        if (sum < s)

        {

           j++;

        }

        else {

           int L = j - i + 1;

           minL = L < minL ? L : minL;

           i++;

        }

    }

    return minL;

}

    int main()

    {

        int num[] = { 2,3,1,2,4,3 };

        int size = 6;

        int s = 7;

        int a = Leet(num, size, s);

        printf("%d\n", a);

        return 0;

    }

螺旋矩阵先鸽着

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值