day002-数组-有序数组的平方、长度最小的子数组、螺旋矩阵II

977.有序数组的平方

题目建议: 本题关键在于理解双指针思想

题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/
文章讲解:https://programmercarl.com/0977.%E6%9C%89%E5%BA%8F%E6%95%B0%E7%BB%84%E7%9A%84%E5%B9%B3%E6%96%B9.html
视频讲解: https://www.bilibili.com/video/BV1QB4y1D7ep

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int> result(nums.size(), 0);
        int low = 0, high = nums.size() - 1;
        int idx = high;
        while (low <= high) {
            if (nums[low] * nums[low] >= nums[high] * nums[high]) {
                result[idx--] = nums[low] * nums[low];
                low++;
            }
            else {
                result[idx--] = nums[high] * nums[high];
                high--;
            }
        }
        return result;
    }
};

思路

看到题目首先想到的是暴力遍历,但是效率太低,是O(n + log n), 第一个n是算平方,第二个logn是排序,是不可接受的,不满足题目要求。所以需要用双指针法,因为原数组是升序的,只有头尾可能有最大值,所以需要头尾双指针向内收缩,比较后插值,
时间复杂度为O(n),
空间复杂度为O(n)

注意

其中有几个遗忘的点在于vector的初始化可以通过初始函数实现,nums(size,0),其中size是元素数量,0为设定的初始值;以及c++中vector的末尾元素添加用的是push_back(), 不是python的append函数

209.长度最小的子数组

题目建议: 本题关键在于理解滑动窗口,这个滑动窗口看文字讲解 还挺难理解的,建议大家先看视频讲解。 拓展题目可以先不做。

题目链接:
文章讲解:
视频讲解:

class Solution {
public:
// 这个双指针滑动窗口的意义是在每一个右边界时找到最大左边界,即子数组结尾元素固定时,找最短的头元素
    int minSubArrayLen(int target, vector<int>& nums) {
        // int left, right, sum = 0, result = INT_MAX;
        // for (left = 0, right = 0; right < nums.size();right++) {
        //     sum += nums[right];
        //     while (sum >= target) {
        //         result = result < (right - left + 1) ? result : (right - left + 1);
        //         sum -= nums[left];
        //         left++;
        //     }
            
        // }
        // return result == INT_MAX ? 0 : result;

        int left = 0, right = 1, sum = nums[0], result = INT_MAX;
        for (right = 1; right <= nums.size();right++) {
            while (sum >= target) {
                result = result < (right - left) ? result : (right - left);
                sum -= nums[left];
                left++;
            }
            if (right < nums.size()) {
                sum += nums[right];
            }
            
        }
        return result == INT_MAX ? 0 : result;
    }
};

思路

第一个想到的是双侧循环,暴力求解,但时间复杂度是O(n^2),题目要求O(n),所以不可行,所以用双指针滑动窗口,而由于该题中的原数组是无序的,所以在每次改变窗口大小时,需要右一个固定边界,以固定边界作为遍历的标志。在这里需要求最小子数组长度,所以以右侧边界为遍历标志。
实质上本题的双指针窗口的意义是在每一个右边界时找到最大左边界,即子数组结尾元素固定时,找最短的头元素
时间复杂度O(n)
空间复杂度O(1)

注意

尾减头长度计算需要记得+1,整数最大值是INT_MAX,三目条件运算符格式例如取最大:x= x>y?x:y
如果头尾两个while循环,是需要数组事先排序,如升序排序下,和大了就缩小左边界,和小了就放大右边界。

59.螺旋矩阵II

题目建议:本题关键还是在转圈的逻辑,在二分搜索中提到的区间定义,在这里又用上了。

题目链接:
文章讲解:
视频讲解:

自己写的

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n, vector<int>(n, 0));
        int count = 1, i, j, loop;
        for (i = 0, j = 0, loop = 0; loop < n / 2; i++, j++, loop++) {
            while (j < n - 1 - loop) res[i][j++] = count++;
            while (i < n - 1 - loop) res[i++][j] = count++;
            while (j > loop) res[i][j--] = count++;
            while (i > loop) res[i--][j] = count++;
        }
        if (n % 2) res[loop][loop] = count;
        return res;
    }
};

代码随想录给的

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n, vector<int>(n, 0));
        int startx = 0, starty = 0;
        int loop = n / 2;
        int mid = n / 2;
        int count = 1;
        int offset = 1;
        int i, j;
        while (loop --) {
            for (j = starty; j < n - offset; j++) {
                res[startx][j] = count++;
            }
            for (i = startx; i < n - offset; i++) {
                res[i][j] = count++;
            }
            for (; j > starty; j--) {
                res[i][j] = count++;
            }
            for (; i > startx; i--) {
                res[i][j] = count++;
            }
            startx++;
            starty++;
            offset++;
        }
        if (n % 2) {
            res[mid][mid] = count;
        }
        return res;
    }
};

评论老哥给的

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        int t = 0;      // top
        int b = n-1;    // bottom
        int l = 0;      // left
        int r = n-1;    // right
        vector<vector<int>> ans(n,vector<int>(n));
        int k=1;
        while(k<=n*n){
            for(int i=l;i<=r;++i,++k) ans[t][i] = k;
            ++t;
            for(int i=t;i<=b;++i,++k) ans[i][r] = k;
            --r;
            for(int i=r;i>=l;--i,++k) ans[b][i] = k;
            --b;
            for(int i=b;i>=t;--i,++k) ans[i][l] = k;
            ++l;
        }
        return ans;
    }
};

思路

最简单的一道题竟然搞了非常久的时间,主要的原因在于除以2的时候,应当是 / 2,顺手用了python的 // 2,想整除,结果忘了在C++里面是注释,而颜色又不显眼,导致始终没发觉错误,耽搁了非常长的时间,以为是夹杂了哪个中文全角符号,排查了很久。
代码随想录的代码,和评论老哥的代码可以看做是两个习惯了,第三种代码的习惯更贴近我的思想,只是我想尽可能节省自定义符号,所以用了loop来写,需要稍微绕一点点,也无法避免最后奇数情况下对中央的补充,所以还是第三种好一些。
当然第二种代码思路非常清晰,每次循环的起点,变量与不变量,过程,循环次数很分明,可以作为思想模板。
时间复杂度O(n^2)
空间复杂度O(1)

注意

vector建立双层数组:
vector<vector> result(n, vector(n, 0));
c++注释是 // 不要顺手用了
对于边界,还是建立专门的变量保存比较方便控制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/7739.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(数字图像处理MATLAB+Python)第四章图像正交变换-第二节:离散余弦变换和K-L变换

文章目录一&#xff1a;离散余弦变换&#xff08;Discrete Cosine Transform&#xff0c;DCT&#xff09;&#xff08;1&#xff09;一维DCTA&#xff1a;定义B&#xff1a;实例&#xff08;2&#xff09;二维DCTA&#xff1a;定义B&#xff1a;实例C&#xff1a;程序&#xff…

CTFHub | 双写后缀

0x00 前言 CTFHub 专注网络安全、信息安全、白帽子技术的在线学习&#xff0c;实训平台。提供优质的赛事及学习服务&#xff0c;拥有完善的题目环境及配套 writeup &#xff0c;降低 CTF 学习入门门槛&#xff0c;快速帮助选手成长&#xff0c;跟随主流比赛潮流。 0x01 题目描述…

使用Python、Contours绘制等高线

主要是通过python、opencv库的子模块Contour来分析灰度图&#xff0c;并绘制等高线 参考文档&#xff1a;https://docs.opencv.org/ 安装opencv pip install opencv-python 分析位图文件&#xff0c;将颜色分层&#xff0c;并绘制等高线 import cv2 as cv imgcv.imread(&qu…

软件安全测试有哪些测试手段?软件测试报告收费贵吗?

如今人们对于软件信息技术的依赖度越来越高&#xff0c;产品安全性也成为了用户选择该产品的第一考虑项。软件安全测试是软件测试中十分重要的测试活动&#xff0c;是一种验证软件系统安全等级和识别潜在安全性缺陷的过程。 一、软件安全测试的测试手段 1、静态的代码安全测试…

实时聊天如何改变您的在线商店

您的客户服务团队应该使用聊天功能吗&#xff1f;是的&#xff0c;绝对需要&#xff01;比如SaleSmartly&#xff08;ss客服&#xff09;的实时聊天&#xff0c;其功能可以改善您的客户服务互动并增加您的销售额。 53%的人更愿意与企业聊天&#xff0c;而不必打电话给他们回答客…

SOLIDWORKS三维建模的十大应用技巧

Solidworks是一套基于三维建模的机械CAD软件&#xff0c;它具有基于特征、单一数据库、参数化设计及全相关性等特性&#xff0c;广泛应用于机械、汽车和航空等领域。 PART1. 定制个性工具栏 SolidWorks具有的CommandManager&#xff0c;是一个上下文相关工具栏&#xff0c;它可…

SpringCloud-高级篇(一)

目录&#xff1a; &#xff08;1&#xff09;初识Sentinel-雪崩问题的解决方案 &#xff08;2&#xff09;服务保护Sentinel和Hystrix对比 &#xff08;3&#xff09;Sentinel初始-安转控制台 &#xff08;4&#xff09;整合微服务和Sentinel 微服务高级篇 &#xff08;1&…

2021蓝桥杯真题小平方 C语言/C++

问题描述 小蓝发现, 对于一个正整数 n 和一个小于 n 的正整数 v, 将 v 平方后对 n 取余可能小于 n 的一半, 也可能大于等于 n 的一半。 请问, 在 1 到 n−1 中, 有多少个数平方后除以 n 的余数小于 n 的一半。 例如, 当 n4 时, 1,2,3 的平方除以 4 的余数都小于 4 的一半。 …

【Java版oj】day28反转部分单向链表、猴子分桃

目录 一、反转部分单向链表 &#xff08;1&#xff09;原题再现 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;完整代码 二、猴子分桃 &#xff08;1&#xff09;原题再现 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;完整代码 一、反转…

【二叉树OJ题(二)】前序遍历中序遍历后序遍历另一颗树的子树二叉树遍历平衡二叉树

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录二叉树OJ练习(二)1、…

精彩回顾 | 平行云亮相LiveVideoStack2022北京站

3月31日&#xff0c;LiveVideoStack 2022 北京站隆重开幕&#xff0c;全球多媒体创新专家、音视频技术工程师、产品负责人、音视频用户等共襄盛会&#xff0c;聚焦音频、视频、图像、元宇宙、AI 等技术的最新探索。本届大会历时2天&#xff0c;12个技术专题&#xff0c;近百位行…

2023年一个完整的B2B订货网站源码

随着互联网技术的飞速发展&#xff0c;网上订货已经成为了许多企业不可或缺的一部分。一个完整的订货网站源码可以为企业提供方便、高效的订货交流平台&#xff0c;从而提高企业的效率和盈利能力。那么&#xff0c;2023年一个完整的订货网站源码需要多少钱呢&#xff1f;核货宝…

‘protoc-gen-js‘ 不是内部或外部命令,也不是可运行的程序

最近电脑重装了系统&#xff0c;但今天又需要将proto文件转化为js文件。 所以又走了一遍以下流程&#xff1a;proto文件生成js文件流程 但是打开链接后发现更新了很多版本&#xff0c;所以下载了最新的版本&#xff1a; 安装之后发现无法正常生成文件&#xff0c;并且报错&…

在DongshanPI-D1开箱使用分享与折腾记录实现MPU6050数据读取

前言 上一篇文章使用RT-Smart的IIC驱动OLED屏幕&#xff0c;进行基本的字符串显示,在使用过程中对RT-Smart有了一定熟悉&#xff0c;准备使用SPI驱动ST7789&#xff0c;但SPI接口没有引出&#xff0c;本次使用手上已有的传感器MPU6050进行使用。 过程 本次直接开始添加离线包…

面向对象编程(基础)8:关键字:package、import

目录 8.1 package(包) 8.1.1 语法格式 说明&#xff1a; 8.1.2 包的作用 8.1.3 应用举例 举例2&#xff1a;MVC设计模式 8.1.4 JDK中主要的包介绍 8.2 import(导入) 8.2.1 语法格式 8.2.2 应用举例 8.2.3 注意事项 8.1 package(包) package&#xff0c;称为包&#x…

【面试】分库分表15道面试题

文章目录前言1. 我们为什么需要分库分表1.1 为什么要分库1.2 为什么要分表2. 什么时候考虑分库分表&#xff1f;3. 如何选择分表键4.非分表键如何查询5. 分表策略如何选择5.1 range范围5.2 hash取模5.3 一致性Hash6. 如何避免热点问题数据倾斜&#xff08;热点数据&#xff09;…

Python基础(二)

1.python变量 1.1整型变量 变量的值是随时可以变化的&#xff0c;它的值等于最后一次给它赋值的数据 变量通常由字母、数字和下划线组成&#xff0c;但是千万记得不能以数字打头 >>> x 3 //声明整型变量并赋值为3 >>> print(x) //打印输出整…

第二章Python序列-列表

列表&#xff1a;1.创建列表&#xff08;1&#xff09;直接将一个列表对象赋给变量>>> a[1,2,3,4,5] >>> a [1, 2, 3, 4, 5]>>> a_list[a,b,mpilgrim,z,example] >>> a_list [a, b, mpilgrim, z, example] >>> a_list[] #创建空…

ROS实践06 自定义消息类型

文章目录运行环境&#xff1a;思路&#xff1a;1.1 定义.msg文件1)功能包下新建 msg 目录&#xff0c;添加文件 Person.msg2)修改package.xml3)修改CMakeLists.txt2.1 自定义消息调用(C)1&#xff09;编译后修改includePath2&#xff09;发布方实现2.1修改CMakeLists.txt2.3运行…

Java基础(一)Java语言概述及入门

1 Java语言概述 1.1Java概述 是SUN(Stanford University Network&#xff0c;斯坦福大学网络公司 ) 1995年推出的一门高级编程语言。是一种面向Internet的编程语言。Java一开始富有吸引力是因为Java程序可以在Web浏览器中运行。这些Java程序被称为Java小程序&#xff08;appl…
最新文章