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

news2024/9/22 23:30:49

1、977. 有序数组的平方

在这里插入图片描述

方法1:使用暴力法,一遍for,一次排序。这个时间复杂度是 O(n + nlogn), 可以说是O(nlogn)的时间复杂度。

class Solution {
    public int[] sortedSquares(int[] nums) {
        //先计算出平方
        for(int i=0;i<nums.length;i++){
            int sum = nums[i]*nums[i];
            nums[i] = sum;
        }
        //再进行排序
        Arrays.sort(nums);
        return nums;
    }
}

方法2 使用双指针法,定义左右指针,时间复杂度O(n),实质是花费O(n)的空间记录。因为nums是有序的,大一点的值肯定在左右两边。
在这里插入图片描述

 //双指针方法
     public int[] sortedSquares(int[] nums) {
      //记录数组长度
       int n = nums.length-1;
       //定义左右指针
       int leftIndex = 0,rightIndex=n;
       //记录数组,相比暴力,实质就是空间换时间
       int []arr = new int[nums.length];
       while(leftIndex<=rightIndex){
           int x = nums[leftIndex]*nums[leftIndex];
           int y = nums[rightIndex]*nums[rightIndex];
           if(x<=y){
               arr[n--] = y
               rightIndex--;
           }else{
               arr[n--] = x;
               leftIndex++;
           }
       }
       return arr;
    }

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

在这里插入图片描述
在这里插入图片描述

方法1:使用暴力法,找到最小的子数组,时间复杂度O(n*n)
我把 >=s 看成 =s,
暴力解法已经超时了。

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int minVal=Integer.MAX_VALUE;
        int n =nums.length;
        for(int i =0;i<n;i++){
            int sum = 0;
            int index = 0;
            for(int j=i;j<n;j++){
                sum+=nums[j];
                index++;
                if(sum >= target){
                    minVal = Math.min(minVal,index); //记录最小的
                }
                //if(target>sum) continue;//后面的值肯定越来越大,剪枝
            }
        }
        return (minVal == Integer.MAX_VALUE)?0:minVal; //排除一个没找到的情况
    }
}
// 2 3 1 2 4 3
// 2 3
// 2 3 1
// 2 3 1 2

方法2:滑动窗口

  • 数组操作中另一个重要的方法:滑动窗口。

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

  • 在暴力解法中,是一个for循环滑动窗口的起始位置,一个for循环为滑动窗口的终止位置,用两个for循环 完成了一个不断搜索区间的过程。

  • 在本题中实现滑动窗口,主要确定如下三点:
    窗口内是什么?
    如何移动窗口的起始位置?
    如何移动窗口的结束位置?
    窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。

  • 窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。

  • 窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。

 public int minSubArrayLen(int target, int[] nums) {
        int minVal=Integer.MAX_VALUE;
        int n =nums.length;
        int left = 0; //滑动窗口起始位置
        int sum = 0;
        for(int right=0;right<n;right++){
            sum+=nums[right];
            while(sum>=target){
               minVal = Math.min(minVal,right-left+1);
                sum -= nums[left]; //收缩左边,即要减去
                left++;  //收缩左边,left右移动
            }
        }
        return (minVal == Integer.MAX_VALUE)?0:minVal;
    }

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

3、59. 螺旋矩阵 II

在这里插入图片描述

  • 模拟顺时针画矩阵的过程:
    填充上行从左到右
    填充右列从上到下
    填充下行从右到左
    填充左列从下到上
    由外向内一圈一圈这么画下去。

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

  • 这里一圈下来,我们要画每四条边,这四条边怎么画,每画一条边都要坚持一致的左闭右开,或者左开右闭的原则,这样这一圈才能按照统一的规则画下来。

  • 在这里插入图片描述

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

  • 这也是坚持了每条边左闭右开的原则。

class Solution {
    public int[][] generateMatrix(int n) {
        //3*3
        //从左到右 从上到下 从右到左 从下到上
        int arr[][] = new int[n][n];
        int loop =0;//控制循环次数
        int start = 0 ;//每次循环的开始点(start,start)
        int index =1; //定义要填充的数字
        int i,j; //标志位
        while(loop++<n/2){ //判断边界后,loop从1开始,因为要一圈一圈的走
            //模拟上侧 从左到右
            for(j = start;j<n-loop;j++){
                arr[start][j] = index++;
            }
            //模拟右侧 从上到下
            for(i = start;i<n-loop;i++){
                arr[i][j] = index++;
            }
            //模拟下侧 从右到左
            for(;j>=loop;j--){
                arr[i][j] = index++;
            }
           //模拟左侧 从下到上
            for(;i>=loop;i--){
                arr[i][j] = index++;
            }
             // 第二圈开始的时候,起始位置要各自加1, 例如:第一圈起始位置是(0, 0),第二圈起始位置是(1, 1)
            start ++;
        }
        // 如果n为奇数的话,需要单独给矩阵最中间的位置赋值
       if(n % 2 == 1){
        arr[start][start] =index;
       }
       return arr;
    }
}

时间复杂度 O(n^2): 模拟遍历二维矩阵的时间
空间复杂度 O(1)

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

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

相关文章

Vulnhub项目:JANGOW 1.0.1

靶机地址&#xff1a;Jangow: 1.0.1 ~ VulnHub 渗透过程&#xff1a; kali ip&#xff1a;192.168.56.104&#xff0c;使用arp-scan -l查看到靶机ip192.168.56.118 对靶机进行端口探测&#xff0c;发现了21、80端口 访问80端口&#xff0c;发现site目录 点击进去后&#xff0…

HIVE SQL 进行 Join 和 group by的具体原理及分区方式

HIVE SQL 实现Join和group by 具体原理 1、JOIN 在map的输出value中为不同表的数据打上tag标记&#xff0c;在reduce阶段根据tag判断数据来源。MapReduce的过程如下&#xff1a; 2、 GROUP BY HIVE SQL 实现Join和group by 的分区原理 1、JOIN 在join操作中&#xff0c;两个…

【Java】哔哩哔哩编程题练习

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶 每日随心练&#xff0c;望各位大佬喜欢&#xff0c;做法有很多种&#xff0c;以下是我个人的想法 目录 一、复数乘法 二、一年中的第几天 三、k个一组翻转链表 一、复数乘法 输入两个表示复…

电路中电容的作用

总体目录 电源设计中常见电容常见电容作用降压滤波高通滤波平滑输出电压 延时耦合去耦/退耦旁路 不常用电容作用调谐电容衬垫电容补偿电容中和电容稳频电容定时电容加速电容启动电容运转电容 电源设计中常见电容 安规电容 常见电容作用 https://www.bilibili.com/video/BV…

【K8S系列】深入解析控制器

目录 序言 1 基础介绍 1.1 前情提要 1.2 Kube-controller-manager介绍 1.3 控制器类型 2 使用介绍 2.1 控制循环 2.2 Deployment控制器 实际状态&#xff1a; 期望状态&#xff1a; PodTemplate&#xff1a; 3 总结 4 投票 序言 在你想要放弃的时候&#xff0c;想…

常见的上采样操作以及其Pytorch实现

文章目录 常见的上采样操作以及其Pytorch实现一、[插值](https://www.cnblogs.com/zhaozhibo/p/15024928.html)1.最近邻插值2.双线性插值3.双三次插值 二、反卷积三、sub-pixel Convolution四、其它方法1.[superpoint](https://arxiv.org/abs/1911.11763)使用方法2.待补充 常见…

Word 设置标题编号

用到了多级列表&#xff0c;所谓多级列表&#xff0c;就是为段落标上编号&#xff0c;并不一定就要对文字使用&#xff0c; 教程参考自Word 多级列表编号方法总结&#xff08;二&#xff09;——自定义编号 - 知乎 直接看我的就好了 假设我们有一个需求 类似于这样的三级标题…

【SpringBoot】面试必杀技-泰山陨石坠,SpringBoot中主启动类的run方法启动流程是什么?

开头导语由Chatgpt完成 当今互联网行业中&#xff0c;Java后端开发岗位的竞争异常激烈&#xff0c;对于面试者来说&#xff0c;掌握一些技巧和知识点将有助于脱颖而出。而对于SpringBoot框架的使用和运行机制&#xff0c;更是Java后端开发岗位中不可或缺的技能点之一。在Spring…

Python里的元组、列表和字典区别

列表&#xff1a;可更改、有序、可重复、元素可以是任何对象 列表示例&#xff1a;[1,a,[2,3]] 元组&#xff1a;不可更改、有序、可重复、元素可以是任何对象 元组示例&#xff1a;(b,1,[2,3]) 字典&#xff1a;可更改、无序、键不可重复、键不可变、值可以是任何对象&…

【Redis-面试题及持久化方案】Redis相关面试题(缓存穿透、缓存击穿、缓存雪崩) Redis两种持久化方案详情对比(RDB、AOF)

【Redis-面试题及持久化方案】Redis相关面试题&#xff08;缓存穿透、缓存击穿、缓存雪崩&#xff09; & Redis两种持久化方案详情对比&#xff08;RDB、AOF&#xff09; 1&#xff09;Redis 面试题1.1.高频面试题&#xff1a;缓存穿透、缓存击穿、缓存雪崩1.2.低频面试题&…

校友小程序定制开发 带我们回到那个学生时代

学生时代总是给人一种单纯美好的感觉&#xff0c;也会是每个人记忆深处最深刻的回忆&#xff0c;尤其是一起学习生活几年的同窗随着毕业不得不各奔东西&#xff0c;但是大家都对母校有着不一样的情怀&#xff0c;也想有一个什么东西能够把各个高校校友联系在一起。校友小程序开…

瑞芯微 Rockchip rknn 模型在线预编译

瑞芯微 Rockchip rknn 模型在线预编译 flyfish 主机Host环境 Distributor ID: Ubuntu Description: Ubuntu 22.04.2 LTS Release: 22.04 Codename: jammy开发板Target环境 RV1126一 主机连接开发板 用线连起来后&#xff0c;查看usb信息 没权限的提示 no permissions (…

微信小程序笔记(1)

小程序笔记 小程序一个页面为什么有四个文件&#xff1f; [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZVdz4I1W-1681982063887)(C:\Users\26387\AppData\Roaming\Typora\typora-user-images\image-20230419170019877.png)] wxss&#xff1a;写页…

对学历贬值的再观察

最近在求职市场上观察到这样一个现象&#xff0c;有些4年前硕士学历就能进入的职业&#xff0c;现在都要博士了&#xff0c;不免让人有一种4年书白读的感觉。所以想再观察一下学历贬值&#xff0c;平复一下心情&#xff08;不是&#xff09;。 学历贬值的原因&#xff1a;供大于…

day1 Flappy bird项目介绍

项目介绍 功能分析&#xff1a; 1、按下空格小鸟上升&#xff0c;不按下落&#xff1b; 2、搭建小鸟需要穿过的管道&#xff1b; 3、管道自动左移和创建&#xff1b; 4、小鸟触碰到管道游戏结束&#xff1b; 知识储备&#xff1a; 1、C语言&#xff1b; 2、数据结构 -…

【Vue2源码】响应式原理

【Vue2源码】响应式原理 文章目录 【Vue2源码】响应式原理Vue响应式的核心设计思路整体流程响应式中的关键角色检测变化注意事项响应式原理数据观测重写数组7个变异方法增加__ob__属性__ob__有两大用处&#xff1a; Vue.js 基本上遵循 MVVM&#xff08;Model–View–ViewModel&…

[oeasy]python0135_变量名与下划线_dunder_声明与赋值

变量定义 回忆上次内容 变量 就是 能变的量上次研究了 变量标识符的 规则 第一个字符 应该是 字母或下划线合法的标识符可以包括 大小写字母数字下划线 还研究了字符串(str)的函数 isidentifier查询字符串 是否为合法标识符 最后发现 这个isidentifier函数有时候不好使&…

实战iOS App 重签名

熟悉iOS开发的同学都知道,iOS应用的上架流程主要分为以下几步: 创建开发者账号借助辅助工具appuploader创建证书,描述文件iTunes connect创建App打包IPA上传App Store等待审核在签名的流程中,有一个App重签名的步骤,主要针对的是一些大公司有多个App的情况,多个App一个申…

Linux设备驱动开发 - S3C2440时钟分析

By: fulinux E-mail: fulinuxsina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅&#xff01; 你的喜欢就是我写作的动力&#xff01; 目录 系统框架图FLCK,HCLK,PCLK时钟源的选择 时钟体系流程流程分析驱动中的clk 系统框架图 2440是一个SOC(system on …

【网络编程】网络编程 和 Socket 套接字认识

✨个人主页&#xff1a;bit me&#x1f447; ✨当前专栏&#xff1a;Java EE初阶&#x1f447; 目 录 &#x1f3a7;一. 网络编程基础&#x1f3ba;1. 为什么需要网络编程&#xff1f;&#x1f3b7;2. 什么是网络编程&#x1f3b8;3. 网络编程中的基础概念 &#x1f3bf;二. So…