【Day2】977有序数组的平方、209长度最小的子数组、59螺旋矩阵Ⅱ

news2024/11/23 9:26:29

【Day2】977有序数组的平方、209长度最小的子数组、59螺旋矩阵Ⅱ

  • 977有序数组的平方
    • 暴力排序
    • 双指针法
  • 209长度最小的子数组
    • 暴力解法
    • 滑动窗口法
  • 59螺旋矩阵Ⅱ

977有序数组的平方

题目链接:977
题目:给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

暴力排序

每个数平方之后,排序。

class Solution {
public:
    vector<int> sortedSquares(vector<int>& A) {
        for(int i=0;i<A.size();i++){
            A[i]*=A[i];
        }
        sort(A.begin(),A.end());//快速排序
        return A;
    }
};
//时间复杂度是 O(n + nlogn)

双指针法

数组是有序的,负数平方后会变大,那么数组平方后的新数组中的最大值可能就在最左端或最右端,不会在中间(数组是有序的),考虑双指针法,i指向起始位置,j指向终止位置。
定义一个新数组result,和A数组一样的大小,让k指向result数组终止位置

如果A[i] * A[i] < A[j] * A[j] 那么result[k--] = A[j] * A[j];

如果A[i] * A[i] >= A[j] * A[j] 那么result[k--] = A[i] * A[i];

class Solution {
public:
    vector<int> sortedSquares(vector<int>& A) {
        int k=A.size()-1;   //k是新数组的下标
        vector<int> result(A.size(), 0);
        for(int i=0,j=A.size()-1;i<=j;){
            if(A[i]*A[i]<A[j]*A[j]){
                result[k--]=A[j]*A[j];
                j--;
            }else{
                result[k--]=A[i]*A[i];
                i++;
            }
        }
        return result;
    }
};
//时间复杂度为O(n)

209长度最小的子数组

题目链接:209
题目:
给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

暴力解法

两个for循环,一个for循环是区间的起始位置,一个for循环是区间的终止位置,然后不断的寻找符合条件的子序列,时间复杂度很明显是O(n^2)。


class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int result = INT32_MAX; // 最终的结果
        int sum = 0; // 子序列的数值之和
        int subLength = 0; // 子序列的长度
        for (int i = 0; i < nums.size(); i++) { // 设置子序列起点为i
            sum = 0;
            for (int j = i; j < nums.size(); j++) { // 设置子序列终止位置为j
                sum += nums[j];
                if (sum >= s) { // 一旦发现子序列和超过了s,更新result
                    subLength = j - i + 1; // 取子序列的长度
                    result = result < subLength ? result : subLength;
                    break; // 因为我们是找符合条件最短的子序列,所以一旦符合条件就break
                }
            }
        }
        // 如果result没有被赋值的话,就返回0,说明没有符合条件的子序列
        return result == INT32_MAX ? 0 : result;
    }
};
//时间复杂度:O(n^2)
//空间复杂度:O(1)

滑动窗口法

滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果

滑动窗口只用一个for循环,循环的索引是滑动窗口的终止位置。

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int result=INT32_MAX;  
        int sum=0;    //滑动窗口数值之和
        int i=0;      //滑动窗口起始位置
        int subLength=0;     //滑动窗口的长度
        for(int j=0;j<nums.size();j++){
            sum+=nums[j];
            while( sum >= target){
                subLength = (j-i+1);  //新数组的长度
                result = result < subLength ? result : subLength;
                sum -= nums[i++];    //初始下标i向后移,sum减去前面i的值
            }
        }
        return result == INT32_MAX ? 0 : result;
    }
};
//时间复杂度:O(n)
//空间复杂度:O(1)

【注意】INT32_MAX
//INT_MAX是一个很大的数,
INT32_MAX=2^31-1
INT32_MIN=-2^31

59螺旋矩阵Ⅱ

面试高频题
题目链接:59
题目:
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

在这里插入图片描述
求解本题要坚持循环不变量原则

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

填充上行从左到右
填充右列从上到下
填充下行从右到左
填充左列从下到上
由外向内一圈一圈这么画下去。
每画一条边都要坚持一致的左闭右开,或者左开右闭的原则,这样这一圈才能按照统一的规则画下来。

视频讲解:59螺旋矩阵

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n, vector<int>(n, 0)); // 使用vector定义一个二维数组
        int startx = 0, starty = 0; // 定义每循环一个圈的起始位置
        int loop = n / 2; // 每个圈循环几次,例如n为奇数3,那么loop = 1 只是循环一圈,矩阵中间的值需要单独处理
        int mid = n / 2; // 矩阵中间的位置,例如:n为3, 中间的位置就是(1,1),n为5,中间位置为(2, 2)
        int count = 1; // 用来给矩阵中每一个空格赋值
        int offset = 1; // 需要控制每一条边遍历的长度,每次循环右边界收缩一位
        int i,j;
        while (loop --) {
            i = startx;
            j = starty;

            // 下面开始的四个for就是模拟转了一圈
            // 模拟填充上行从左到右(左闭右开)
            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++;
            }

            // 第二圈开始的时候,起始位置要各自加1, 例如:第一圈起始位置是(0, 0),第二圈起始位置是(1, 1)
            startx++;
            starty++;

            // offset 控制每一圈里每一条边遍历的长度
            offset += 1;
        }

        // 如果n为奇数的话,需要单独给矩阵最中间的位置赋值
        if (n % 2) {
            res[mid][mid] = count;
        }
        return res;
    }
};```

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux常用命令——xargs命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) xargs 给其他命令传递参数的一个过滤器 补充说明 xargs 命令是给其他命令传递参数的一个过滤器&#xff0c;也是组合多个命令的一个工具。它擅长将标准输入数据转换成命令行参数&#xff0c;xargs 能够处理管道…

python--城堡保卫战

实现功能&#xff1a; 1&#xff1a;敌人的绵绵不断的前进&#xff0c;拿着各种各样的武器&#xff08;叉子&#xff0c;斧头&#xff0c;宝剑&#xff09;&#xff0c;挥动武器攻击我方城堡&#xff0c;对我方城堡造成伤害&#xff01; 2&#xff1a;我方城堡发现敌人可手动…

Linux-文件系统

Windows文件系统 在Windows下&#xff0c;打开“计算机”&#xff0c;我们看到的是一个个驱动盘符。 注意&#xff1a;盘符与硬件不是对应的&#xff0c;比如说电脑有有一块硬盘&#xff0c;到Windows下可以将其切成C、D、E盘&#xff0c;也就是一个硬盘可以放多个盘符。 Lin…

maple-example简单操作示例

好久都没写博客了&#xff0c;今天学习到一点新知识&#xff0c;在这里小编和大家分享&#xff0c;欢迎大家指点&#xff0c;这篇文章是关于 maple-example的简单操作示例&#xff0c;具体软件下载不做讲解&#xff0c;谢谢&#xff01;

浅谈分辨率带宽RBW

频谱仪是射频工程师最常用的设备之一&#xff0c;信号的频率、功率、谐波、相位噪声等诸多射频参数都需要使用频谱仪测试。使用频谱仪时&#xff0c;有一个参数需要经常设置&#xff0c;就是分辨率带宽(Resolution BW&#xff0c;简称RBW)。RBW是指中频链路上最小的中频滤波器带…

Enhance the Visual Representation via Discrete Adversarial Training

在自然语言处理NLP中&#xff0c;AT可以从泛化中受益&#xff0c;我们注意到AT在NLP任务中的有优点可能来自于离散和符号输入空间。为了借鉴NLP风格AT的优势&#xff0c;我们提出了离散对抗训练&#xff08;DAT&#xff09;。DAT利用VQGAN将图像数据改为离散的类似文本的输入&a…

Vuex的学习内容

本教程使用的是vue3 1.核心概念 官网地址:https://vuex.vuejs.org/安装(固定)配置项(固定) 2. 图示关系 单一定义store对象,里面5个配置项,在任意组件可以使用. 3.案例准备 准备两个组件AddItem.vue、SubItem.vue、Main.vue 展示效果如下: AddItem代码 <template&…

STL - String容器

1. string基本概念 本质&#xff1a; string是C风格的字符串&#xff0c;而string本质上是一个类 string和char *的区别&#xff1a; char *是一个指针 string是一个类&#xff0c;类内部封装了char *,管理这个字符串&#xff0c;是一个char *型的容…

本地小说阅读网站打造

目录 一、本地小说网站总体组织框架 1、所需的VUE库和elementLib以及JQ库 2、本地目录设计 3、整体代码样式 二、正文核心代码 1、引入element 样式&#xff0c;和自定义的样式 2、引入JS 3、自定义Header组件 1&#xff09;vue 定义MyHeader组件 2&#xff09;MyHead…

Mapstruct的具体介绍与使用

我是 ABin-阿斌&#xff1a;写一生代码&#xff0c;创一世佳话&#xff0c;筑一览芳华。 如果小伙伴们觉得我的文章不错&#xff0c;记得一键三连哦 文章目录一、mapstruct简介二、mapstruct与其他映射对比三、mapstruct底层原理解析1、Java动态编译四、具体使用1、依赖导入2、…

Linux开发工具的使用(三)

文章目录Linux开发工具的使用&#xff08;三&#xff09;1. 缓冲区1.1 理解\r和\n1.2 缓冲区的初步理解1.3 倒计时小程序实现1.4 进度条小程序实现2. 分布式版本控制系统-git使用2.1 git历史2.2 git版本控制理解2.3 git使用2.3.1 gitee搭建远程仓库2.3.2 开始配置3. Linux调试器…

Revit教程:创建“幕墙竖梃族”的方法步骤

幕墙竖梃族分为两个组成部分&#xff1a;“幕墙竖梃”和“公制轮廓-竖梃”&#xff0c;前者是基于后者轮廓的一个实体拉伸&#xff0c;两者的关系类似于实体与草图。轮廓族及门窗族 (公制门-幕墙&#xff0c;公制窗-幕墙而非公制门与公制窗)可以嵌套入CAD详图或Revit详图&#…

93、【树与二叉树】leetcode ——222. 完全二叉树的节点个数:普通二叉树求法+完全二叉树性质求法(C++版本)

题目描述 原题链接&#xff1a;222. 完全二叉树的节点个数 解题思路 1、普通二叉树节点个数求法 &#xff08;1&#xff09;迭代&#xff1a;层序遍历BFS 遍历一层获取一层结点 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode …

【九】Netty HTTP+XML协议栈开发

HTTP协议介绍业务场景流程图技术栈设计流程图的分析:Step 1Step2Step3Step4Step5分析结果开发开发流程图代码jar 依赖代码结构如图pojo 包request包response 包client 包server包编码解码基类代码说明测试服务端打印结果客户端打印结果总结介绍 由于HTTP协议的通用性&#xff…

使用js实现一个可以【放烟花】的小游戏

放烟花游戏需求&#x1f447;核心玩法&#x1f447;&#x1f447;界面原型&#x1f447;&#x1f447;成品演示&#x1f447;游戏开发1.游戏素材准备2.代码实现1.创建index.html页面2.首页-开始3.加载烟花音效4.重玩儿放烟花的小游戏。点击页面放烟花。兼容移动端。 游戏需求 …

作为普通网民,这些“实用电脑神器”,值得你知道

国内软件夹缝里求生存&#xff0c;由于某些不良软件&#xff0c;许多人对于国产软件认识多为“流氓、捆绑、多广告”&#xff0c;其实并非如此&#xff0c;下面几款让你刮目相看&#xff0c;扭转观念。 1、图片视频画质增强器 这是一款功能极其强大的图片与视频画质增强器&…

阿里云数据湖3.0解决方案两度登上InfoQ 2022年度榜单

经过一个多月的层层竞选&#xff0c;【阿里云数据湖 3.0 解决方案】从 130 多个方案中脱颖而出&#xff0c;荣获 InfoQ 2022 年度中国技术力量年度榜单《十大云原生创新技术方案》&《云原生十大场景化落地方案》双料大奖&#xff0c;这是头部技术媒体对阿里云存储的再一次认…

低代码是什么?有什么优势?一文看懂LowCode

低代码到底是什么&#xff1f;用最简单的方式告诉我&#xff1f;低代码是近两年来一个很热门的概念&#xff0c;尤其是疫情的影响&#xff0c;市场对低代码的需求不断增加&#xff0c;但到底什么是低代码&#xff1f;它到底有什么好处&#xff1f;这篇就为大家解答这个问题&…

vue2.0 插槽不是响应性的

请注意插槽不是响应性的。如果你需要一个组件可以在被传入的数据发生变化时重渲染&#xff0c;我们建议改变策略&#xff0c;依赖诸如 props 或 data 等响应性实例选项。-- vm.$slots 问题描述 项目中自定了组件 widget&#xff0c;作为容器&#xff0c;其中 header 部分做了预…

SCI投稿:MDPI旗下期刊Mathematics投稿经历

最近写了篇论文&#xff0c;由于国内期刊现状&#xff08;懂的都懂&#xff09;&#xff0c;打算投国外的期刊&#xff0c;看来看去选择投MDPI旗下的Mathematics。手稿经过一轮大修之后顺利收到了Accepted&#xff0c;过程还是比较顺利的&#xff0c;记录一下投稿过程。 论文撰…