目录

一、今日心得感悟

1、数组从小到大排序

①冒泡法--时间复杂度:O(nlogn)

②使用排序函数qsort--时间复杂度:O(nlogn)

③两端->中间(双指针法) --时间复杂度:O(n)

④归并排序(双指针法) --时间复杂度:O(n)

2、二维数组的访问及动态分配

3、时间复杂度

4、滑动窗口

二、题目

977.有序数组的平方

题目链接

想法

代码实现(未看视频/题解)

遇到的问题

209.长度最小的子数组

题目链接

想法

代码实现(未看视频/题解)

遇到的问题

59.螺旋矩阵II

题目链接

想法

代码实现(未看视频/题解)

遇到的问题

附录


一、今日心得感悟

1、数组从小到大排序

冒泡法--时间复杂度:O(nlogn)

②使用排序函数qsort--时间复杂度:O(nlogn)

使用方法:

qsort(array, arraySize, sizeof(a[0]), cmp);

int cmp(const void* a1, const void* b1)

{

int a = *(int*)a1;

int b = *(int*)b1;

return a - b;

}

两端->中间(双指针法) --时间复杂度:O(n)

思路与算法

同样地,我们可以使用两个指针分别指向位置 0 和 n−1,每次比较两个指针对应的数,选择较大的那个逆序放入答案并移动指针。

这种方法无需处理某一指针移动至边界的情况,读者可以仔细思考其精髓所在。

归并排序(双指针法) --时间复杂度:O(n)

思路与算法

如果我们能够找到数组中负数与非负数的分界线,那么就可以用类似「归并排序」的方法了。

具体地,我们设neg为数组中负数与非负数的分界线,也就是说:

array[0] ~ array[neg] 均为负数;

array[neg + 1] ~ array[n - 1] 均为负数

当我们将数组中的数平方后,那么array[0] ~ array[neg]单调递减,array[neg + 1] ~ array[n - 1] 单调递增。

由于我们得到了两个已经有序的子数组,因此就可以使用归并的方法进行排序了。

具体地,使用两个指针分别指向位置 neg 和 neg + 1 ,每次比较两个指针对应的数,选择较小的那个放入答案并移动指针。当某一指针移至边界时,将另一指针还未遍历到的数依次放入答案。

2、二维数组的访问及动态分配

未整理完,整理过程参考的资料如下:

1、用指针访问二维数组

(1条消息) 用指针访问二维数组_指针指向二维数组_宗谷.的博客-CSDN博客

2、二维数组及其动态内存分配

(1条消息) 二维数组及其动态内存分配_二维数组动态分配内存_Baymaxly的博客-CSDN博客

3、时间复杂度

O(1) < O(logn) < O(n) < O(nlogn) < O() < O() < O() < O() < O()

4、滑动窗口

滑动窗口适用范围:

顺序不可变的数组Array中找 连续子数组 array

二、题目

977.有序数组的平方

题目链接

977. 有序数组的平方 - 力扣(LeetCode)

想法

法1:先得到新数组,在对新数组进行排序(qsort)

时间复杂度:O(nlogn)

法2:

时间复杂度:O(n)

代码实现(未看视频/题解)

/*** Note: The returned array must be malloced, assume caller calls free().*/
int cmp(const void*a1, const void*b1){int a = *(int*)a1, b = *(int*)b1;return a - b;
}int* sortedSquares(int* nums, int numsSize, int* returnSize){int *ret = (int*)malloc(numsSize * sizeof(int));*returnSize = numsSize;for(int i = 0; i < numsSize; i++){ret[i] = nums[i] * nums[i];}qsort(ret, numsSize, sizeof(int), cmp);return ret;
}

遇到的问题

未能在时间复杂度为O(n)时做出解答(对于原数组有负有正的排序未成功)

209.长度最小的子数组

题目链接

209. 长度最小的子数组 - 力扣(LeetCode)

想法

1、先把题目做出来(不考虑时间复杂度的问题)

2、若超时,则重新思考---“滑动窗口”

代码实现(未看视频/题解)

1、第一次实现的代码超出了时间限制---时间复杂度:O(n²)

int minSubArrayLen(int target, int* nums, int numsSize){int ret = 0, len = 1, flag = 0, cnt = 0;long long sum = 0;for(int i = 0; i < numsSize; i++){sum += nums[i];if(sum >= target){flag = 1;cnt++;ret = 1;}else if(i < (numsSize - 1)){for(int j = i + 1; j < numsSize; j++){sum += nums[j];len++;if(sum >= target){flag = 1;cnt++;if(cnt == 1){ret = len;}if(ret > len){ret = len;}break;}}}sum = 0;len = 1;}return ret;
}

2、第二次实现的代码(滑动窗口)---时间复杂度:O(n)

int minSubArrayLen(int target, int* nums, int numsSize){int index1 = 0, index2 = 0;int len, ret = 0, cnt = 0;long long sum = 0;while(index1 < numsSize){// 求lenlen = index2 - index1 + 1;// 求sumif(index2 == index1)sum += nums[index1];else if(index2 <= (numsSize - 1)) sum += nums[index2];// 判断here:if(sum < target){if(index2 < (numsSize - 1))index2++;elsebreak;}else{// 得到retcnt++;if(cnt == 1)ret = len;else if(ret > len){ret = len;}sum -= nums[index1];index1++;len = index2 - index1 + 1;goto here;}}                           return ret;
}

遇到的问题

未看题解时,只能想出O()算法。

59.螺旋矩阵II

题目链接

59. 螺旋矩阵 II - 力扣(LeetCode)

想法

此题以前做过,方法是:

从左到右

从上到下

从右到左

从下到上

依次给数组赋值

代码实现(未看视频/题解)

/*** Return an array of arrays of size *returnSize.* The sizes of the arrays are returned as *returnColumnSizes array.* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().*/
int** generateMatrix(int n, int* returnSize, int** returnColumnSizes){int** ret = malloc(sizeof(int*) * n);*returnSize = n;*returnColumnSizes = malloc(sizeof(int) * n);for (int i = 0; i < n; i++) {ret[i] = malloc(sizeof(int) * n);(*returnColumnSizes)[i] = n;}int left = 0, right = n - 1, up = 0, down = n - 1;int i = 0, j = 0, num = 1;while(left <= right && up <= down){// 左 -> 右for(j = left; j <= right; j++){*(*(ret + up) + j) = num++;}up++;// 上 -> 下for(i = up; i <= down; i++){*(*(ret + i) + right) = num++;}right--;// 右 -> 左for(j = right; j >= left; j--){*(*(ret + down) + j) = num++;}down--;// 下 -> 上for(i = down; i >= up; i--){*(*(ret + i) + left) = num++;}left++;}return ret;
}

遇到的问题

有一种想法,叫做leetcode的想法……

“int left = 0……”上面的代码是看题解后修改的,未看题解前:

认为returnSize是n²,结果题解是n

附录

思路与算法的具体内容见下:

作者:LeetCode-Solution
链接:https://leetcode.cn/problems/squares-of-a-sorted-array/solution/you-xu-shu-zu-de-ping-fang-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

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

    leetcode 977.有序数组的平方 想到昨天写的双指针,十分刻意用了一下,感觉还是比较生疏,还得加强练习和思考,然后发现还需要排序,想到了vector的排序sort(),但是觉得直接用不好,也忘 ...

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

    LeetCode 977.有序数组的平方 题目链接:977.有序数组的平方 思路: 1.先对每个数进行遍历平方,并插入新的容器中 2.对容器进行排序,返回就可以了 缺陷:开辟了新的容器空间 class ...

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

    LeetCode 977.有序数组的平方 双指针法:数组其实是有序的, 只不过负数平方之后可能成为最大数了.那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间.此时可以考虑双指针法 ...

  4. 随想录一期 day2 [977.有序数组的平方|209. 长度最小的子数组|59.螺旋矩阵II(剥洋葱)]

    977.有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序. 思路 递增数组,平方后最大值一定在最左侧或者最右侧,可想到– ...

  5. 977. 有序数组的平方|209. 长度最小的子数组|59. 螺旋矩阵 II

    977. 有序数组的平方 原理 准备:双指针.一个空数组.双指针指向的两个元素作比较,更大的数平方之后,放入空数组的尾部空位. 图解 其实这题的指针有两种方法: 从两边向中间靠拢,得到的是由大到小的值 ...

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

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

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

    目录: 977.有序数组的平方 209.长度最小的子数组 1.暴力输出法 2.滑动窗口法 59.螺旋矩阵II 总结: 今日收获: 977.有序数组的平方 因为是递增且有负数的数组,那么他们的平方如果还 ...

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

    day2 | LeetCode977.有序数组的平方.209.长度最小的子数组.59.螺旋矩阵II 创建时间: October 13, 2022 3:29 PM 一.今日任务 977.有序数组的平方 ...

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

    代码随想录算法训练营第二天 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II 977.有序数组的平方 题目链接:有序数组的平方 题目描述: 给你一个按 非递减顺序 排序的整 ...

最新文章

  1. Nature:科学家成功解读大脑构建的分子机制
  2. 编程之美-构造数独方法整理
  3. A review of 3D/2D registration methods for image-guided interventions(2)
  4. springboot引入本地jar包,并且打jar包时包含本地jar
  5. 生成xml_freemarker快速生成xml文件
  6. linux上的MySQL默认端口,linux下mysql 查看默认端口号与修改端口号方法
  7. 【JAVA】Socket文件上传遇到的问题!~
  8. 计算机无法打印图片,电脑中打印机可以打印文档却无法打印图片如何解决
  9. 群晖万兆文件服务器,NAS进阶 篇三:2019年最具性价比的NAS硬件是什么暨黑群晖万兆搭建经验介绍...
  10. 知识图谱指南:从理论到应用
  11. 黑客电影《我是谁:没有绝对安全的系统》正片(含下载)
  12. speedoffice(Word)如何给文字添加下划线
  13. 红米k40和红米k40pro的区别 哪个好
  14. 数字水印进阶篇——基于DWT-SVD的数字水印(附matlab代码)
  15. SQL注入漏洞攻守之道
  16. 双指针之两数之和,三数之和,N数之和系列
  17. 大智慧365除权数据导出存通达信板块源码+工具
  18. [JAVA实战篇] AES加密的JAVA实现及AES算法讲解
  19. FPGA UART仿真
  20. koa+vue+百度云实现人脸识别

热门文章

  1. Sip服务器搭建全过程(Linphone拨号)
  2. vue 直接访问静态图片_vue中显示静态图片怎么引用
  3. win10去除管理员账户密码后出现两个账号的解决方法
  4. solidity抢红包合约的实现
  5. 李宏毅ML lecture-14 unsupervised Learning Word Embeddng
  6. 用Python画如此漂亮的专业插图 ?简直So easy!
  7. 音视频编解码知识学习详解(分多部分进行详细分析)
  8. 十代主板改win7_联想天逸510S台式机10代cpu装win7系统及bios设置教程(支持usb)
  9. Linux之RAID介绍、软RAID5实操配置(失望攒够了就放手,不打扰是我最后的温柔)
  10. Generative Adversarial Nets——NIPS2014