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

news2024/11/17 7:30:06

数组理论基础

文章链接:https://programmercarl.com/%E6%95%B0%E7%BB%84%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html

977.有序数组的平方

题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/description/

思路1.暴力排序

将每个数平方之后,直接排序

class Solution {
    public int[] sortedSquares(int[] nums) {
        for(int i=0;i<nums.length;i++){
            nums[i] = nums[i] * nums[i];
        }

        Arrays.sort(nums);
        return nums;
    }
}

时间复杂度 O(n + nlogn)

思路2.双指针法

注意这里数组是有序的,只不过在负数平方之后,有可能会变成最大数。
那么数组平方后的最大值,要么是在最左边,要么就是在最右边。
这里的话,我们就可以使用双指针,i指向起始位置,j指向终止位置。
然后,定义一个新的数组,和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 int[] sortedSquares(int[] nums) {
      int i = 0;
      int j = nums.length-1;
      int[] result = new int[nums.length];
      int k = j;
      while(k>=0)
      {
          if(nums[i]*nums[i] >= nums[j]*nums[j]){
              result[k--] = nums[i]*nums[i];
              i++;
          }
          else{
            result[k--] = nums[j]*nums[j];
            j--;
          }
            
      }

        return result;
    }
}

时间复杂度 O(n),比暴力解法提升了很多

209.长度最小的子数组

题目连接:https://leetcode.cn/problems/minimum-size-subarray-sum/

解法1:暴力解法(遍历所有可能的子序列)

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)

解法2:滑动窗口

用一个for循环,如何表示滑动窗口的起始位置,还是终止位置。
假如我们用一个for循环,来表示滑动窗口的起始位置,那么遍历剩下的终止位置,又会陷入了暴力解法之中。
因此,这个循环的索引,只能是表示滑动窗口的终止位置。
那么,滑动窗口的起始位置如何移动,需要我们进行考虑。
具体见动画演示
在这里插入图片描述

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int len = nums.length;
        int i = 0;
        int sum = 0;
        int result = 9999999;
        for(int j=0;j<len;j++){
            sum = sum + nums[j];
            while(sum>=target){
                result = Math.min(result,j-i+1);
                sum -= nums[i];
                ++i;
            }
        }
        if(result==9999999) result = 0;
        return result;
    }
}

时间复杂度:O(n),不要以为for里放一个while就以为是O(n^2), 主要是看每一个元素被操作的次数,每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被操作两次,所以时间复杂度是 2 × n 也就是O(n)。

#相关题目推荐

59.螺旋矩阵II

题目连接:https://leetcode.cn/problems/spiral-matrix-ii/

解法:模拟过程

本题并不涉及到什么算法,就是模拟过程,但却十分考察对代码的掌控能力。
求解本题依然是要坚持循环不变量原则。
我们模拟顺时针画矩阵的过程,由外向内一圈一圈的画下去,这里一圈下来,我们要画每四条边,这四条边怎么画,每画一条边都要坚持一致的左闭右开,或者左开右闭的原则,这样这一圈才能按照统一的规则画下来。
这里我们按照左闭右开的原则。
在这里插入图片描述

这里每一种颜色,代表一条边,我们遍历的长度,可以看出每一个拐角处的处理规则,拐角处让给新的一条边来继续画。

然后就是还要注意一个点,当n为奇数的时候,中间会多出一个方块,单独赋值即可。

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] a = new int[n][n];
        // 定义起始点
        int startx = 0,starty=0;
        // 循环次数
        int loop = n/2;
        int offset = 1;
        int i,j;
        int count = 1;
        // 左闭右开的原则
        while(loop-- > 0)
        {   
            i=startx;j=starty;
            // 最上面
            for(j=starty;j<n-offset;j++){
                a[i][j] = count++;
            }
            // 右边(此时i=n-offset了)
            for(i=startx;i<n-offset;i++){
                a[i][j] = count++;
            }
            // 下边(此时i,j在最下角)
            for(;j>starty;j--)
                a[i][j] = count++;
            for(;i>startx;i--)
                a[i][j] = count++;
            
            // 第二圈开始的时候,起始位置要各自加1, 例如:第一圈起始位置是(0, 0),第二圈起始位置是(1, 1)
            ++startx;
            ++starty;
            // 控制每一圈里遍历的长度,例如第一圈是n-1,第二圈就是n-2
            ++offset;
          
        }
        
        if(n%2!=0)
            a[n/2][n/2] = count; 
        return a;
        
        
        
    }
}

时间复杂度:O(n^2)
空间复杂度:O(1)

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

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

相关文章

国科 GK7201V200 SOC芯片

1.概述 GK7201V200 芯片是国科推出的新一代高集成度、高画质、低码率、低功耗的 AI IP Camera SoC 芯 片。 芯片集成 ARM Cortex A7 处理器&#xff0c;支持专业的 ISP 图像处理单元&#xff0c;H.265/H.264 视频编码&#xff0c;满足客户 差异化业务需求。同时集成了 Ethe…

国产六核CPU商显板,三屏异显,米尔基于全志D9360开发板

芯驰D9-Pro 自主可控、安全可信的高性能商显方案 采用国产CPU&#xff1a;集成了6个ARM Cortex-A551.6GHz 高性能CPU和1个ARM Cortex-R5800MHz&#xff1b; 高性能的高安全HSM安全的处理器&#xff0c;支持TRNG、AES、RSA、SHA、SM2/3/4/9&#xff1b; 它包含100GFLOPS 3D G…

打印的前后顺序

面试题经常会有 <script>console.log(1)setTimeout(function(){console.log(2)})console.log(3)let pnew Promise((resolve,reject) >{console.log(4)resloved(hhhhhh)})p.then(res >{console.log(res)console.log(5)},res >{console.log(7)})console.log(6)&l…

如何进行大数据系统测试

大数据系统常见的架构形式有如下几种&#xff1a; Hadoop架构&#xff1a; Hadoop Distributed File System (HDFS)&#xff1a;这是一种分布式文件系统&#xff0c;设计用于存储海量数据并允许跨多台机器进行高效访问。 MapReduce&#xff1a;作为Hadoop的核心计算框架&#…

JBOD详解

JBOD是存储领域中一类重要的存储设备。 英文全称Just a bunch of disks, 中文也称之为硬盘存储扩展柜。 它是传统存储系统赖以生存的根基之一&#xff0c;如果没有JBOD&#xff0c;那一下子就会省去很多部件&#xff1a;后端HBA、SAS扩展器/FC成环器、线缆、JBOD控制模块等等…

高周期的伦敦金交易机会转到低周期做 不可以吗?

一般的市场观点认为&#xff0c;交易信号出现在越高的时间周期上就越准确&#xff0c;成功的概率就越高。而低时间周期的信号&#xff0c;要推动高时间周期行情的发展&#xff0c;那几乎是不可能。因此多数人认为从高周期转到低周期&#xff0c;然后去捕捉高周期行情机会&#…

强化学习应用(二):基于Q-learning的无人机物流路径规划研究(提供Python代码)

一、Q-learning简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于马尔可夫决策过程&#xff08;MDP&#xff09;的问题。它通过学习一个价值函数来指导智能体在环境中做出决策&#xff0c;以最大化累积奖励。 Q-learning算法的核心思想是通过不断更新一个称为Q值的…

GIS数据

version: 0.2 文章目录 1. GIS 数据类型2. 矢量2.1 Shapefile2.1.1 Wiki介绍2.1.2 重点总结2.1.3 样例 2.2 GeoJSON2.2.1 Wiki介绍2.2.2 重点总结2.2.3 样例 3. 栅格3.1 GeoTIFF3.1.1 Wiki介绍3.1.2 重点总结3.1.3 样例 4. 矢量栅格4.1 GeoPackage4.1.1 Wiki介绍4.1.2 重点总结…

3dmax灯光缓存参数怎么设置?解析来了!

细分&#xff1a;用来决定灯光缓存的样本数量&#xff0c;样本数量以此数值的平方来计算。数值越高&#xff0c;效果越好&#xff0c;速度越慢。一般出图建议1000到1800之间已经足够了。 采样大小&#xff1a;用来控制灯光缓存的样本尺寸大小&#xff0c;较小的数值意味着较小…

FastAdmin西陆教育系统(xiluEdu)开源代码

应用介绍 一款基于FastAdminThinkPHPUniapp开发的西陆教育系统&#xff08;微信小程序、移动端H5、安卓APP、IOS-APP&#xff09;&#xff0c;以下是教育系统所包含的一些功能&#xff1a; 视频课程&#xff1a;教育系统提供在线视频课程&#xff0c;学生可以通过网络观看教师…

dp专题11 一和零

本题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 思路&#xff1a; 由题意&#xff0c;这里有两个特征&#xff0c;要求满足选取的字符串总和中&#xff0c;0的个数和1的个数分别不超过m个0 和 n个 1&#xff0c;问选取的字符串最多有多少个…

Linux网络基础及bonding实际操作

1.查看linux基础的网络配置 网关&#xff1a;route -n ip地址&#xff1a;ifconfig 或 ip a DNS服务器&#xff1a;cat /etc/resolv.conf 主机名&#xff1a;hostname 路由&#xff1a;route -n 网络连接状态&#xff1a;ss 或 netstat 2.临时修改网卡名称 3.永久修…

IP核RAM学习

RAM 的英文全称是 Random Access Memory&#xff0c;即随机存取存储器&#xff0c;它可以随时把数据写入任一指定地址的存储单元&#xff0c;也可以随时从任一指定地址中读出数据&#xff0c;其读写速度是由时钟频率决定的。RAM 主要用来存放程序及程序执行过程中产生的中间数据…

在实验室内里的无奈

洋洋洒洒&#xff0c;随口就来。 不知道什么时候起&#xff0c;我喜欢静谧的环境&#xff0c;身边环境太嘈杂&#xff0c;我就容易心烦意乱&#xff0c;记得以前是完全没有这样的毛病的&#xff0c;不过好在&#xff0c;总是能找到安静的地方&#xff0c;我甚至一度极端&#x…

Vue2 实现带输入的动态表格,限制el-input输入位数以及输入规则(负数、小数、整数)

Vue2 实现el-input带输入限制的动态表格&#xff0c;限制输入位数以及输入规则&#xff08;负数、小数、整数&#xff09; 在这个 Vue2 项目中&#xff0c;我们实现一个限制输入位数&#xff08;整数16位&#xff0c;小数10位&#xff09;以及输入规则&#xff08;负数、小数、…

计算机毕业设计-----Springboot ERP管理系统

项目介绍 系统主要功能包括&#xff1a; 首页 零售管理&#xff1a;零售出库、零售退货&#xff1b; 采购管理&#xff1a;采购订单、采购入库、采购退货&#xff1b; 销售管理&#xff1a;销售订单、销售出库、销售退货&#xff1b; 仓库管理&#xff1a;其它入库、其它出库、…

从零开始搭建一个个人博客并部署发布

1、为什么要自己搭建一个个人博客呢 首先&#xff0c;市场上主流的个人博客有CSDN、掘金、博客园等博客平台&#xff0c;这些平台方便了用户创作、记录的同时&#xff0c;也存在一些弊端&#xff0c;比如某些平台可能你的文章阅读量过高的话&#xff0c;会强制收费等问题已经是…

Linux 软连接ln -s

什么是文件软链接&#xff1f; Linux 的“软连接”与windos 的"快捷方式"相似。文件软链接&#xff08;Symbolic Link 或 SymLink&#xff09;是一种特殊的文件类型&#xff0c;它实际上是一个指向另一个文件或目录的引用。创建软链接时&#xff0c;系统会建立一个新…

线性代数:由矩阵 AB=A 可以推出 B=E 吗?

其实&#xff0c;类似的问题在十几年前的各种提问中就出现了&#xff0c;而且&#xff0c;根据 A B A A BA ABA 推出 B E BE BE 有时候也相当 "符合直觉”&#xff0c;但如果追根问底&#xff0c;矩阵 B B B 到底应该是什么样子的&#xff0c;却很少有详细的解答。 …

高斯数据库 Gauss

gauss DB OLTP 交易 保证数据和安全&#xff0c;主要是银行使用 gauss DB OLAP 分析 大部分是网络公司 gsql 使用gauss数据库的工具 $ gsql -d 数据库名 -p 端口号 -u 用户名 -w 密码 -h 客户端ipgsql 常用参数 -d选项&#xff1a; 指定gsql客户端连接的数据库-h选项&#xff1…