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

LeetCode 977 有序数组的平方

本题思路:最容易想到的就是使用暴力循环的方式,将数组每个值都平方,然后进行一个排序操作。但是这样做,使用快排,它的复杂度也是 ologn。
所以,我们可以尝试用双指针的方法
一个 指针 left = 0,一个指针 right = nums.length-1。然后对比 nums[left] 和 nums[right]的大小,谁大,赋值给 result的数组,从result数组从下标 cur = nums.length-1 开始赋值。赋值完 cur-- 。 如果 nums[left] 大,则 left++, 如果 nums[right]大,则 right–。相等随便哪个都行。 最终 left>right 的时候,停止循环。

class Solution {public int[] sortedSquares(int[] nums) {int left = 0;int right = nums.length - 1;int cur = nums.length - 1;int[] result = new int[nums.length];while(left <= right){if(nums[left]*nums[left] < nums[right]*nums[right]){result[cur--] = nums[right] * nums[right];right--;}else{result[cur--] = nums[left] * nums[left];left++;}}return result;}
}

下面用一个图,来演示下测试用例的一个过程,以便更加直观的分析了解代码。
在这里插入图片描述

  • 第一次循环,判断 nums[left] * nums[left] 和 nums[right]*nums[right] 大小,此时 nums[right]*nums[right] 大,则 将 result[cur] = nums[right]*nums[right],并且 cur–,right–。
    在这里插入图片描述
  • 第二次循环,判断 nums[left] * nums[left] 和 nums[right]*nums[right] 大小,此时 nums[left]*nums[left] 大,则 将 result[cur] = nums[left]*nums[left],并且 cur–,left++。
    在这里插入图片描述
  • 第三次循环,判断 nums[left] * nums[left] 和 nums[right]*nums[right] 大小,此时 nums[right]*nums[right] 大,则 将 result[cur] = nums[right]*nums[right],并且 cur–,right–。在这里插入图片描述
  • 第四次循环,判断 nums[left] * nums[left] 和 nums[right]*nums[right] 大小,此时 nums[left]*nums[left] 大,则 将 result[cur] = nums[left]*nums[left],并且 cur–,left++。在这里插入图片描述
  • 第四次循环,判断 nums[left] * nums[left] 和 nums[right]*nums[right] 大小,此时相等,则 将 result[cur] = nums[left]*nums[left],并且 cur–,left++。在这里插入图片描述
  • 最后循环条件不能满足,终止。

LeetCode 209 长度最小的子数组

本题思路:使用滑动窗口的思想来解决这道题目,就用示例中的样例,来画个图分析以下思想。
在这里插入图片描述

  • 初始状态下,i = 0, j = 0
    在这里插入图片描述
  • 现在开始 j 向右滑动窗口,一直到找到 sum 的值 >= target 就停止在这里插入图片描述
  • 然后就应该,i 向右 缩减窗口大小,直至 sum < targer,为止,在这过程如果遇到了 sum = target 的情况,就记录下长度在这里插入图片描述
  • 继续 i 往右边缩减窗口大小, 此时 sum < target, 就要开始 j 向右移动增加窗口的大小在这里插入图片描述
  • 此时又相当于 回到了初始状态,i == j。 那么之间 j 走过的地方 就可能已经找到包含满足条件的 长度最小的子数组。接着继续往后找是否还存在。

这整一个查找的过程就相当于是一个 滑动的窗口,一直往后滑动,并没有往回查找。

class Solution {public int minSubArrayLen(int target, int[] nums) {int i = 0;int j = 0;int sum = 0;int minLen = Integer.MAX_VALUE;int len = 0;for(;j<nums.length;j++){// 如果 sum 值小于 target  j++ 窗口向右扩展sum += nums[j];// sum > target就开始 i 向右 缩减窗口大小while(sum >= target){// 记录当前长度len = j - i + 1;if( len < minLen){minLen = len; }sum -= nums[i];i++;    }}return minLen != Integer.MAX_VALUE?minLen:0;}
}

LeetCode 59 螺旋矩阵||

本题思路:就要在于这个边界的判断,此处我使用的是左闭右开的一个区间。如下图所示
在这里插入图片描述
以上就是一圈,定义一个 staryx = 0, 一个starty = 0。用来表示起始位置,定义一个 i , 一个 j 来移动给数组赋值。依次从上侧(从左往右),从右侧(从上往下),从下侧(从右往左),从左侧(从下往上),对数组进行相应的赋值。 还有一个重点,就是考虑 i 和 j 的位置到哪里是 边界停止,就要设定一个 offset 偏移量,边界为 n- offset 。并且矩阵的大小跑完一圈,就相当于缩小了,所以 offset 也需要改变。

class Solution {public int[][] generateMatrix(int n) {int[][] result = new int[n][n];int startx = 0;int starty = 0;int i = 0;int j = 0;// 表示绕几圈,可以自己画个图,就知道规律了int loop = n / 2;int count = 1; // 用来给数组赋值int mid = n / 2; // 当 n 为奇数的时候,中间值的坐标就是  result[mid][mid]int offset = 1; // 表示偏移量// 使用左闭右开原则while(loop-- != 0 ){// 上侧 从左往后遍历  i不变, j变for(j = starty; j < n - offset; j++){result[startx][j] = count++;}// 右侧 从上往下遍历  j不变,i变for(i = startx; i < n - offset; i++){result[i][j] = count++;}// 下侧 从右往左遍历 i不变,j变for(; j > starty; j--){result[i][j] = count++;}// 左侧 从下往上遍历 j不变,i变for(; i > startx; i--){result[i][j] = count++;}// 转完一圈后startx++;starty++;offset++;}// 特殊情况,如果 n 为奇数,需要填充中间if(n % 2 == 1){result[mid][mid] = count;}return result;}
}

下面以下个示例,做个图来分析步骤,以便能理解代码的逻辑。
在这里插入图片描述
从题目中分析 ,n = 3 ,所以 顺时针旋转为 n/2=1 圈。 n - 1 = 3 - 1 = 2

  • 上侧(从左往右)j < n - offset = 2在这里插入图片描述
  • 右侧(从上往下) i < n - offset = 2在这里插入图片描述
  • 下侧(从右往左)j > startx=0在这里插入图片描述
  • 左侧(从下往上)i > startx=0在这里插入图片描述
  • 一轮循环结束,最后再将中间的值填充即可。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

构建智能预约系统小程序:技术实现详解

随着移动互联网的发展&#xff0c;预约上门系统小程序成为服务行业中的一项创新解决方案。在这篇文章中&#xff0c;我们将深入研究如何使用技术构建一个强大而高效的预约上门系统小程序&#xff0c;并为你提供详细的技术实现步骤。 1. 开发环境准备 首先&#xff0c;确保你…

离散型概率密度函数的分布列⇔分布函数

目录 一、super误区 1.分布函数的定义 二、分布列⇒分布函数 二、分布列⇐分布函数 一、super误区 我在读定义的时候陷入了一个误区&#xff0c;与大家分享一下。 1.分布函数的定义 由于是离散型的概率密度函数&#xff0c;我把他抽象到数轴上理解&#xff1a; 如下分布…

【加法减法选择计数器_2023.12.15】

功能 计数器位宽为 4&#xff1b;可以实现同步清零&#xff0c;及同步置数的功能&#xff1b;通过一个输入信号来选择&#xff0c;实现加法计数和减法计数&#xff1a; 如果加到最大值后继续加&#xff0c;或减到0后继续减时&#xff0c;计数器不变&#xff1b; 实现 sel端口…

从零开始搭建链上dex自动化价差套利程序(13)

优化 优化触发条件&#xff1a; 之前的触发条件有问题&#xff0c;导致迟迟不能触发&#xff0c;优化后触发条件如下&#xff1a; dydx_take 0.0002apex_make 0.0005​float(b_first_price_apex)-float(s_first_price_dydx) > float(b_first_price_apex)*apex_makefloat…

论文查重过多怎么降重 神码ai

大家好&#xff0c;今天来聊聊论文查重过多怎么降重&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff0c;可以借助此类工具&#xff1a; 论文查重过多怎么降重 当论文查重率过高时&#xff0c;需要进行降重处…

IDEA调整内存大小

一、IDEA开启内存显示 双击shift,搜索show memory indicator 打开后重启&#xff0c;右下角显示IDEA内存占用情况 开启后右下角会显示 二、调整内存 双击shift,搜索vmoption 修改-Xms和-Xmx参数&#xff0c;如下&#xff1a; -Xms:最小内存 -Xmx:最大内存 设置完成后&…

安装LLaMA-Factory微调chatglm3,修改自我认知

安装git clone https://github.com/hiyouga/LLaMA-Factory.git conda create -n llama_factory python3.10 conda activate llama_factory cd LLaMA-Factory pip install -r requirements.txt 之后运行 单卡训练&#xff0c; CUDA_VISIBLE_DEVICES0 python src/train_web.py…

基于若依搭建微服务nacos版本(ruoyi-Cloud前后端分离)

说明&#xff1a;本文介绍基于Ruoyi-Cloud前后端分离nacos版本的微服务从0到1的搭建过程&#xff0c;同时新增一个新的微服务模块。是基于官方文档的补充说明&#xff0c;需要结合Ruoyi-Cloud的官方文档 https://doc.ruoyi.vip/ruoyi-cloud/ 如果直接查看官方文档便可成功部署&…

maven工程中读取resources中的资源文件

maven工程的代码布局如下&#xff1a;在resources下面有一个资源文件test.properties&#xff0c;现在的目标要在Java代码中读取该资源文件中的内容。 test.properties资源文件的内容如下&#xff1a; Java代码如下&#xff1a; package com.thb;import java.io.BufferedR…

TrustZone之中断及中断处理

一、中断 接下来,我们将查看系统中的中断,如下图所示: 通用中断控制器(GIC)支持TrustZone。每个中断源,在GIC规范中称为INTID,分配到以下三个组之一: • Group0:安全中断,以FIQ方式发出信号 • 安全Group1:安全中断,以IRQ或FIQ方式发出信号 • 非安全Gr…

mybatis高级扩展-插件和分页插件PageHelper

1、建库建表 create database mybatis-example; use mybatis-example; create table emp (empNo varchar(40),empName varchar(100),sal int,deptno varchar(10) ); insert into emp values(e001,张三,8000,d001); insert into emp values(e002,李四,9000,d001); insert into…

4.qml 3D-Light、DirectionalLight、PointLight、SpotLight、AxisHelper类深入学习

今天我们学习灯光类 首先来学习Light类&#xff0c;它是所有灯光的虚基类&#xff0c;该类是无法创建的&#xff0c;主要是为子类提供很多公共属性。 常用属性如下所示&#xff1a; ambientColor : color&#xff0c;该属性定义在被该光照亮之前应用于材质的环境颜色。默认值…