977. 有序数组的平方

原理

准备:双指针、一个空数组。双指针指向的两个元素作比较,更大的数平方之后,放入空数组的尾部空位。

图解

其实这题的指针有两种方法:

  • 从两边向中间靠拢,得到的是由大到小的值
  • 从中间向两边靠拢,得到的有由小到大的值

由于想直接得到由小到大的数组,所以我选择找到正负的分界线,然后left、right指针从中间开始,分别向两边走。

这样的方法不如left、right在0和nums.length-1的位置。

因为如果去到中间,left、right的初始位置、循环的终止条件终止条件都更难设置。

而选择left、right从两边向中间靠拢,相遇的时候停止就行,初始位置、终止条件都更好确定。

var sortedSquares = function(nums) {var arr = [];var index = nums.length - 1;// 这里的循环变量增减没有写在for的括号里,原因是:// 这里的left、right的增减是有一定的条件的,要在循环体中用if-else判断如何增减for(var left = 0,right = nums.length - 1;left <= right;) {if(Math.abs(nums[left]) < Math.abs(nums[right])) {arr[index--] = nums[right] * nums[right];right--;}else {arr[index--] = nums[left] * nums[left];left++;}}return arr;
};

209. 长度最小的子数组

题目

给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。

示例:

输入:s = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3] 是该条件下的长度最小的子数组。

思路

根据某一特定的条件来截取一定的子数组。

滑动窗口就是用两个指针来划定一定的区域,就数组来说,也就是可以用滑动窗口截取一段子数组。

所以,这道题应该是用滑动窗口来做

窗口由start和end指针来框定

  • 如果整个窗口的值已经超过target,start就移动,缩小窗口;
  • 如果整个窗口的值没有超过target,end就移动,扩大窗口。

每一次缩小窗口前,都记录这个窗口len有多大,如果窗口比原先的len小,就把len更新。

完整代码

核心代码:窗口缩小

窗口缩小要完成三件事:

1.窗口长度更新

2.窗口最前面的元素移除

3.窗口的start界限向前移动

 while(sum >= target) {// 1.窗口长度更新len = len < (end - start + 1) ? len : (end - start + 1);// 2.窗口最前面的元素移除sum -= nums[start];// 3.窗口的start界限向前移动start++;}

完整代码

var minSubArrayLen = function(target, nums) {var start = 0;var len = Number.MAX_SAFE_INTEGER;var sum = 0;for(var end = 0;end < nums.length;end++) {sum += nums[end];while(sum >= target) {// 1.窗口长度更新len = len < (end - start + 1) ? len : (end - start + 1);// 2.窗口最前面的元素移除sum -= nums[start];// 3.窗口的start界限向前移动start++;}}if(start == 0) {return 0;}return len;
};

细节

  1. 在js中,取大数的:是Number的一个类方法,用Number调,然后加上"最大安全数"的英文
var num = Number.MAX_SAFE_INTEGER;

59. 螺旋矩阵 II

这道题关键的是怎么样把题目中 矩阵 这一图片,转换成用数组来进行描述的变成语言。

所谓模拟螺旋矩阵,其实是向数组里面放一些元素。

而且不能想着一下把这道题的代码写出来,要一点一点的修正才对。

思路

什么叫模拟螺旋矩阵

本题是对螺旋矩阵的模拟。

重点是怎么把这样一个模拟的过程,转换成编程语言。

所谓的“模拟螺旋矩阵”,其实是按照一定的规则,在向一个二维数组里面放数字。

如上图,其实就是把1放入res[0][0],把2放入res[0][1]...

区间不变性

在放入数字的过程中,需要很多轮来处理数字

这时候就要界定,每一轮处理哪些数字,也就是处理数字的区间是什么。

这里选择左闭右开的区间进行处理。

如上图,颜色一样的数字一起处理。

其实,区间不变形就是要保持每次的处理过程是一样的

如上图,每一行,或者每一列都处理前两个数字,最后一个数字留给下一次处理。

需要准备的量

存放结果的二维数组res

初始坐标

设定最开始从第一个格子走,此时startX=0,startY=0。

记录运动坐标

记录x的i,记录y的j

计数器count

res、startX=0,startY=0,i=0,j=0,count=1

对于四条边的模拟

首先看Carl哥第一个for循环代码,发现分为4部分:

也就说只要分别弄清楚4条边的这四个值怎么写,就能把整个过程模拟出来了。

坐标分析:每次循环,x、y坐标中总有一个是不变的,另一个作为for循环中的变量。

起始值:x、y坐标中变化的坐标的起始值

终止条件:在哪里停下

增减:是往前走还是往回走

对橙色边进行模拟

坐标分析:x=startX;y变化

res[startX][j] = count++;

起始值:y=startY

for(j = startY;;)

终止条件:y<3 - 1

for(j = startY;y < 3-1;) 

增减:箭头的方向是X正方向,向前的,所以j++

for(j = startY;y < 3-1;j++)

完整代码

for(j = startY;y < 3-1;j++) {res[startX][j] = count++;
}

黄色边进行模拟

坐标分析:y=j;x变化

起始值:x=startX

终止条件:x < 3 -1

增减:x往前走

for(i=startX;i < 3 - 1;i++) {res[i][j]=count++;
}

蓝色边进行模拟

坐标分析:x=i;y变化

起始值:Y=j

终止条件:y > 0

增减:y往回走

for(j=j;j > 0;j--) {res[i][j] = count++;
}

粉色边进行模拟

坐标分析:y=j;x变化

起始值:x=i

终止条件:x > 0

增减:x往回走

for(i = i;i > 0;i--) {res[i][j] = count++;
}

细节修饰

上述的代码,和完全正确的代码相差之处在于

  • 循环的终止条件
  • 循环次数
  • 奇数最后一格的填充

offset

offset是由于函数不断向内圈循环,于是内圈比起外圈,循环条件缩小

循环的次数

n = 3 循环1次

n = 4 循环2次

n = 5 循环2次

由归纳法,可知loop=n / 2;

看上图,又会发现一个问题,就是n是奇数的时候,中间会有一个空位

这时候其实只要

  • 判断n是否为奇数

    • n为偶数,不操作
    • n为奇数,把最后一个count填入

977. 有序数组的平方|209. 长度最小的子数组|59. 螺旋矩阵 II相关推荐

  1. 随想录一期 day2 [977.有序数组的平方|209. 长度最小的子数组|59.螺旋矩阵II(剥洋葱)]

    977.有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序. 思路 递增数组,平方后最大值一定在最左侧或者最右侧,可想到– ...

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

    LeetCode 977.有序数组的平方 题目链接:977.有序数组的平方 思路: 1.先对每个数进行遍历平方,并插入新的容器中 2.对容器进行排序,返回就可以了 缺陷:开辟了新的容器空间 class ...

  3. 209. 长度最小的子数组(中等 数组 滑动窗口)

    209. 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target . 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, -, n ...

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

    --------------------------- 977.有序数组的平方 #include <iostream> #include <algorithm> #includ ...

  5. LeetCode 209. 长度最小的子数组 (滑动窗口)

    LeetCode 209. 长度最小的子数组 class Solution {public int minSubArrayLen(int s, int[] nums) {int start = 0;i ...

  6. 【宫水三叶的刷题日记】209. 长度最小的子数组(中等)

    题目描述 这是 LeetCode 上的 209. 长度最小的子数组 ,难度为 中等. Tag : 「前缀和」.「二分」 给定一个含有 n 个正整数的数组和一个正整数 target. 找出该数组中满足其 ...

  7. 10. Leetcode 209. 长度最小的子数组 (数组-同向双指针-滑动窗口)

    给定一个含有 n 个正整数的数组和一个正整数 target .找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr ...

  8. LeetCode 209. 长度最小的子数组(滑动窗口)

    1. 题目 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组. 如果不存在符合条件的连续子数组,返回 0. 示例: 输入: s = 7, num ...

  9. LeetCode 209. 长度最小的子数组(双指针+滑动窗口)

    题目描述 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组.如果不存在符合条件的连续子数组,返回 0. 示例: 输入: s = 7, nums ...

最新文章

  1. 关于如何换肤、子类化的解决方案
  2. 在MM32F3273上运行MicroPython,对于性能进行测试
  3. mxnet常规优化器用法
  4. 前端开发群技术文章分享汇总
  5. rsync的配置应用
  6. 致不可重新来过一次的青春(上)
  7. python 对图片进行直方图均衡化处理(批量自动遍历文件夹图片)
  8. 容器编排技术 -- Kubernetes kubectl expose命令详解
  9. slf4j与logback的结合使用
  10. 万维网之父:Facebook、Google 等硅谷巨头必须被拆分!
  11. SQL Server 聚合函数算法优化技巧
  12. python执行命令不阻塞_Python 命令行非阻塞输入
  13. vs2017官方下载路径
  14. windows10安装masscan
  15. python3网络爬虫--爬取华为应用市场app数据(附源码)
  16. 计算机技术比武通讯报道,第十六届后勤优质服务月:各部门积极开展技能比武,强化岗位技能,提升服务水平...
  17. 【linux命令】df和du的区别、文件系统
  18. gpt分区硬盘安装linux,GPT分区表上硬盘安装ubuntu
  19. 什么是Python之禅?
  20. Win11系统打开自带虚拟机平台的方法

热门文章

  1. MATLAB Arnold 的图像置乱加密及解密
  2. html教程自适应,html自适应界面
  3. 批量得到TCGA癌症数据集每个样本的TMB
  4. [问题已处理]-vscode 自动补全的函数没有括号
  5. chcon mysql_Linux中的SELinux与chcon以及Samba实现【转】
  6. 长度9-20个字符,必须包含大小写字母和特殊字符(空格除外)
  7. 小黄的刷题之路(九)——码题集OJ赛-列表实现简单“合成2048”
  8. 关于foreach遍历list删除元素
  9. 【辣眼睛】QQ新功能-照片回收站
  10. html5有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和HTML5?