码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 代码随想录算法训练营第二天(C) | 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵


    文章目录

    • 前言
    • 一、977.有序数组的平方
    • 二、209.长度最小的子数组
    • 三、59.螺旋矩阵
    • 总结

    前言

    java版:

    代码随想录算法训练营第二天 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵_愚者__的博客-CSDN博客


    一、977.有序数组的平方

    双指针法:

    1. int* sortedSquares(int* nums, int numsSize, int* returnSize){
    2. *returnSize = numsSize;
    3. int right = numsSize -1 ;
    4. int left = 0;
    5. int* ans = (int*)malloc(sizeof(int) * numsSize);
    6. int index;
    7. for(int index = numsSize-1;index>=0;index--){
    8. int lSquare = nums[left]*nums[left];
    9. int rSquare = nums[right]*nums[right];
    10. if(lSquare > rSquare){
    11. ans[index] = lSquare;
    12. left++;
    13. }else{
    14. ans[index] = rSquare;
    15. right--;
    16. }
    17. }
    18. return ans;
    19. }

    二、209.长度最小的子数组

    滑动窗口:本质是满足了单调性,即左右指针只会往一个方向走且不会回头。收缩的本质即去掉不再需要的元素。也就是做题我们可以先固定移动右指针,判断条件是否可以收缩左指针算范围。


    加入滑动窗口中有负数怎么办?
    如果有负数的话感觉也不能用滑动窗口了,因为有负数的话无论你收缩还是扩张窗口,你里面的值的总和都可能增加或减少,就不像之前收缩一定变小,扩张一定变大,一切就变得不可控了。如果要 cover 所有的情况,那每次 left 都要缩到 right,那就退化为暴力了哈哈。

    双指针和滑动窗口有什么区别,感觉双指针也是不断缩小的窗口。这道题,我想用两头取值的双指针,结果错了?
    因为两头指针走完相当于最多只把整个数组遍历一遍,会漏掉很多情况。滑动窗口实际上是双层遍历的优化版本,而双指针其实只有一层遍历,只不过是从头尾开始遍历的。

    1. int minSubArrayLen(int target, int* nums, int numsSize){
    2. int minLength = INT_MAX;
    3. int sum = 0;
    4. int left = 0;
    5. int right = 0;
    6. for(;right
    7. sum += nums[right];
    8. while(sum >= target){
    9. int subLength = right - left + 1;
    10. minLength = minLength
    11. sum -= nums[left];
    12. left++;
    13. }
    14. }
    15. return minLength == INT_MAX?0:minLength;
    16. }

    三、59.螺旋矩阵

     

    坚持循环不变量原则。

    模拟顺时针画矩阵的过程:

    • 填充上行从左到右
    • 填充右列从上到下
    • 填充下行从右到左
    • 填充左列从下到上

    由外向内一圈一圈这么画下去。

    可以发现这里的边界条件非常多,在一个循环中,如此多的边界条件,如果不按照固定规则来遍历,那就是一进循环深似海,从此offer是路人。

     

    1. int** generateMatrix(int n, int* returnSize, int** returnColumnSizes){
    2. //初始化返回的结果数组的大小
    3. *returnSize = n;
    4. *returnColumnSizes = (int*)malloc(sizeof(int) * n);
    5. //初始化返回结果数组ans
    6. int** ans = (int**)malloc(sizeof(int*) * n);
    7. int i;
    8. for(i = 0; i < n; i++) {
    9. ans[i] = (int*)malloc(sizeof(int) * n);
    10. (*returnColumnSizes)[i] = n;
    11. }
    12. //设置每次循环的起始位置
    13. int startX = 0;
    14. int startY = 0;
    15. //设置二维数组的中间值,若n为奇数。需要最后在中间填入数字
    16. int mid = n / 2;
    17. //循环圈数
    18. int loop = n / 2;
    19. //偏移数
    20. int offset = 1;
    21. //当前要添加的元素
    22. int count = 1;
    23. while(loop) {
    24. int i = startX;
    25. int j = startY;
    26. //模拟上侧从左到右
    27. for(; j < n - offset; j++) {
    28. ans[i][j] = count++;
    29. }
    30. //模拟右侧从上到下
    31. for(; i < n - offset; i++) {
    32. ans[i][j] = count++;
    33. }
    34. //模拟下侧从右到左
    35. for(; j > startY; j--) {
    36. ans[i][j] = count++;
    37. }
    38. //模拟左侧从下到上
    39. for(; i > startX; i--) {
    40. ans[i][j] = count++;
    41. }
    42. //偏移值每次加2
    43. offset+=1;
    44. //遍历起始位置每次+1
    45. startX++;
    46. startY++;
    47. loop--;
    48. }
    49. //若n为奇数需要单独给矩阵中间赋值
    50. if(n%2)
    51. ans[mid][mid] = count;
    52. return ans;
    53. }


    总结

    附加题这周闲下来再补。

  • 相关阅读:
    06、SpringBoot+微信支付 -->商户定时查订单状态、用户取消订单(关闭订单API)、查询订单API--到微信支付平台查询订单
    React18 渲染列表与添加key值
    目标检测算法改进系列之Backbone替换为FocalNet
    JavaEE 网络原理——TCP的工作机制(初篇 包含 UDP 协议的再次阐述)
    【HTML学生作业网页】基于HTML+CSS+JavaScript仿南京师范大学泰州学院(11页)
    实时操作系统Freertos开坑学习笔记:(七):队列
    将 SAP Spartacus 作为 feature module 进行 Lazy Load 延迟加载时遇到的注入错误分析
    企业的销售活动是什么?CRM销售管理系统给你答案
    神经网络 深度神经网络,深度神经网络工作原理
    二叉树汇总
  • 原文地址:https://blog.csdn.net/m0_51671538/article/details/133134899
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号