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

2023-09-21 15:50:35

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

package com.secondday.array;

/**
 * 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按非递减顺序排序。
 *
 * 示例 1:
 *
 * 输入:nums = [-4,-1,0,3,10]
 * 输出:[0,1,9,16,100]
 * 解释:平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100]
 */
public class SortSqArray {
    public static void main(String[] args) {
        int[] nums = {-4,-1,0,3,10};
        nums = sortSquare(nums);
        for (int n : nums){
            System.out.print(n+" ");
        }
    }


    //相向指针写法
    public static int[] sortSquare(int[] nums){
        int left = 0;
        int right = nums.length-1;
        int[] result = new int[nums.length];
        int k = nums.length-1;

        while (left<=right){
            if (nums[left] * nums[left] < nums[right]*nums[right]){
                result[k--] = nums[right]*nums[right];
                --right;
            }else {
                result[k--] = nums[left]*nums[left];
                ++left;
            }
        }
        return result;
    }
}

小结

使用双向指针,循环条件注意left = right 边界问题,if考虑了<的情况,else考虑了>=的情况,开辟新空间新数组result来实现排序的目的

209.长度最小的子数组

题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/
文章讲解:https://programmercarl.com/0209.%E9%95%BF%E5%BA%A6%E6%9C%80%E5%B0%8F%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84.html
视频讲解:https://www.bilibili.com/video/BV1tZ4y1q7XE

package com.secondday.array;

/**
 * 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。
 *
 * 示例:
 *
 * 输入:s = 7, nums = [2,3,1,2,4,3]
 * 输出:2
 * 解释:子数组 [4,3] 是该条件下的长度最小的子数组。
 * 提示:
 *
 * 1 <= target <= 10^9
 * 1 <= nums.length <= 10^5
 * 1 <= nums[i] <= 10^5
 */
public class MinLengthArray {
    public static void main(String[] args) {
        int[] nums = {2,3,1,2,4,3};
        System.out.println(minSubArrayLen(nums,7));
    }

    public static int minSubArrayLen(int[] nums,int s){
        int i = 0;  //起始指针

        int result = Integer.MAX_VALUE;
        int sum = 0;  //滑动窗口的值
        
        for (int j = 0; j<=nums.length-1;j++){  //j是终止指针
            sum += nums[j];
            //滑动窗口的起始位置考虑
            while (sum>=s){   //当出现>=7的情况
                //计算出最小长度
                int minSubLen = j-i+1;
                result = Math.min(result,minSubLen);

                //终止循环的条件
                sum -= nums[i]; //向后移动一位,减去滑动窗口的头一位
                //起始位置+1
                i++;

            }
        }
        return result == Integer.MAX_VALUE ? 0 : result;   //出现0的情况就是异常,无法满足>=7的情况
    }
}

小结

在O(1)的空间上使用双向指针,并且时间为O(n)的情况,调节指针的位置以便能达到滑动的效果

  • result值的设定
  • 起始指针跟终止指针的指向
  • 计算符合最小长度的情况
  • 异常判断

59.螺旋矩阵II

题目链接:https://leetcode.cn/problems/spiral-matrix-ii/
文章讲解:https://programmercarl.com/0059.%E8%9E%BA%E6%97%8B%E7%9F%A9%E9%98%B5II.html
视频讲解:https://www.bilibili.com/video/BV1SL4y1N7mV/

package com.secondday.array;

/**
 * 给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。
 * 示例:
 * 输入: 3 输出: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ]
 */
public class GenerateMatrix {

    public static void main(String[] args) {

        int[][] res = generateMatrix(3);
        for (int i = 0; i < res.length; i++) {
            for (int j = 0; j <res.length ; j++) {
                System.out.print(res[i][j]+" ");
            }
            System.out.println();
        }

    }

    public static int[][] generateMatrix(int n){
        int loop =0;    //控制循环次数
        int startx = 0; //每次循环开始点
        int starty = 0;	每次循环开始点
        int[][] res = new int[n][n];
        int i,j;		//行、列
        int count = 1; //定义填充数字
        int offset = 1; //控制右开的缩进

        while (loop++ < n/2){  //控制循环次数
            //遵循左闭右开的原则 -->循环不变量

            //模拟上侧从左到右
            for (j = starty;j<n-offset;j++){    //假设n=4,数组下标填充到2,空出3的位置留给下一次填充,并且此时索引j=3,因为最后还会再进行一次判断
                res[startx][j] =count++;
            }

            //模拟右侧从上到下
            for (i=startx;i<n-offset;i++){
                res[i][j] =count++;  //此时的j是不变,j=3
            }

            //模拟下侧从右到左
            for (;j>starty;j--){
                res[i][j] = count++;  //此时i是不变的,j从下标为3的情况进行填充,空出starty的位置留给下一次填充,并且此时的j=0
            }

            //模拟左侧从下到上
            for (;i>startx;i--){
                res[i][j] = count++; //此时的j是不变的,j=0
            }

            //由上四个for循环已经走完一圈 ,初始位置需要变化,还有offset末端距离也需要变化,offset是用来控制右开的距离缩进
            startx++;
            starty++;
            offset++;

        }

        //如果n是偶数正常填充完毕,如果n是奇数的话中间会空出一个位置,中间的位置另外填充
        if (n % 2 == 1){
            res[startx][starty] = count++;
        }

        return res;
    }
}

小结

模拟题,没有计算,看到题目知道结果,使用代码的方式进行表达出来。技巧:

  • 先找出圈数,外层循环,使用一个loop变量进行控制
  • 描写矩阵要遵从左闭右开的原则,使用offset变量控制右开,避免右开被赋值填充
  • 画好外层考虑下一层的位置
  • 最后考虑奇偶的问题,因为偶数中间不会空,奇数会空
更多推荐

【Node.js】模块化:

文章目录1、模块化的基本概念2、Node.js中模块化【1】Node.js中模块的分类【2】加载模块【3】模块作用域【4】向外共享模块作用域中的成员【5】模块化规范3、npm与包(包/依赖/插件)【1】包的基本知识:【2】开发属于自己的包【3】发布包4、模块的加载机制【1】优先从缓存中加载【2】内置模块的加载机制【3】

在Ubuntu系统上实现免费电脑IP更改

大家好!今天我要为大家分享一个关于如何在Ubuntu系统上免费实现电脑IP更改的知识。IP地址更改在某些情况下非常有用,可以帮助我们解决网络连接问题、绕过限制以及加强网络安全等。而在Ubuntu系统上,我们可以采用一些简单的方法来免费更改电脑的IP地址。现在让我们一起来了解一下吧!方法一:使用命令行工具Ubuntu系统

打开泰坦陨落提示msvcp120.dll丢失怎么办?三个解决方法快速解决

首先,我们来了解一下msvcr120.dll是什么文件。msvcr120.dll是一个动态链接库文件,它是MicrosoftVisualC++2013Redistributable中的一个组件。这个文件对于一些软件的运行是非常重要的,如果缺失或损坏,就会导致软件无法正常运行。那么,msvcr120.dll为什么会丢失呢

VL 模型 Open-Set Domain Adaptation with Visual-Language Foundation Models 论文阅读笔记

Open-SetDomainAdaptationwithVisual-LanguageFoundationModels论文阅读笔记一、Abstract二、引言三、相关工作3.1开放域适应3.2源域无关的开放域适应3.3视觉-语言基础模型VLFM四、方法4.1问题陈述4.2采用CLIP的Zero-shot预测4.3ODA

【CVPR2021】MVDNet论文阅读分析与总结

Challenge:现有的目标检测器主要融合激光雷达和相机,通常提供丰富和冗余的视觉信息利用最先进的成像雷达,其分辨率比RadarNet和LiRaNet中使用的分辨率要细得多,提出了一种有效的深度后期融合方法来结合雷达和激光雷达信号。MVDNet本质是将雷达强度图与激光雷达点云深度融合,以利用它们的互补能力。Contr

Socks5代理与网络安全:保护您的隐私与数据

在今天数字化的世界中,隐私和网络安全已经成为至关重要的话题。Socks5代理作为一种强大的工具,不仅为用户提供了隐私保护,还在网络安全和爬虫领域发挥着关键作用。本文将深入探讨Socks5代理的工作原理、其在网络安全中的应用,以及如何在爬虫开发中充分利用它。1.Socks5代理简介Socks5代理是一种网络协议,允许数据

代理IP和Socks5代理在跨界电商中的关键作用

随着跨界电商的兴起,代理IP和Socks5代理成为了技术领域的关键工具。本文将深入探讨它们在跨界电商、爬虫技术和出海战略中的关键作用,以及如何最大程度地利用它们来支持企业的全球扩张。引言简要介绍跨界电商的崛起和全球化趋势。提出代理IP和Socks5代理在这一背景下的重要性。代理IP:跨界电商的智能数据引擎多地区数据采集

Automation Anywhere推出新的生成式AI自动化平台,加速提高企业生产力

在9月19日的Imagine2023大会上,智能自动化领域的领导者AutomationAnywhere宣布对其自动化平台进行扩展。推出了新的ResponsibleAILayer,并宣布了四项关键产品更新,包括全新的Autopilot,它可以利用生成式AI,从流程发现快速开发端到端自动化。此外还宣布了针对商业用户的Aut

9.20广读论文 核心思路笔记

LearnWhatNOTtoLearn:TowardsGenerativeSafetyinChatbots摘要:会话模型中,生成型和开放领域的模型尤其容易产生不安全内容,因为它们是在基于网络的社交数据上进行训练的。以前缓解这个问题的方法有缺点,比如打断对话的流畅性,对未见过的有毒输入上下文的泛化有限,以及为了安全而牺牲

Oracle常见的等待事件

Oracle常见的等待事件等待事件分类常见等待事件buffer等待事件gc等待事件librarycache等待事件cursor等待事件directpath等待事件controlfile等待事件dbfile等待事件logfile等待事件SQL*Net等待事件enq:TX等待事件等待事件分类等待事件有如下分类:admini

折线图geom_line()参数选项

往期折线图教程图形复现|使用R语言绘制折线图折线图指定位置标记折线图形状更改|绘制动态折线图跟着NC学作图|使用python绘制折线图前言我们折线的专栏推出一段时间,但是由于个人的原因,一直未进行更新。那么今天,我们也参考《R语言实战》中折线图部分的讲解,分享给大家。在此书中,关于折线图的绘制教程相对讲解较少,我们要很

热文推荐