一、有序数组的平方

977.有序数组的平方 leetcode链接

1.方法概述

  • 双"指针"解法:因为数组本来是有序的,平方后可能出现的两端大数值大的情况。所以从数组两端开始遍历,谁大就将值赋给新建数组reslut的末端位置index。然后当两端相遇,停止遍历。

2.具体实现

Java实现版本

点击查看代码
class Solution {
public int[] sortedSquares(int[] nums) {
int left = 0;
int right = nums.length - 1;
int[] arr = new int[nums.length];
int index = arr.length - 1; while(left <= right){
if(nums[left]*nums[left] > nums[right]*nums[right]){
arr[index--] = nums[left]*nums[left++];
}else{
arr[index--] = nums[right]*nums[right--];
}
}
return arr;
}
}

3.要点总结

  • 关键点在于数组本来就是有序的,数组元素平方后最大值只可能出现在两端,可能是最右端元素的平方值,也可能是最左端负数的平方值,不可能在中间。
  • index代表的是新建数组result的末端位置,当赋完一次值时需要执行--操作。左端下标left是在赋值完后进行++操作,右端下标right则是执行--操作。这里 nums[left]*nums[left++]; 是在nums[left]*nums[left];赋值操作完成后left才开始++,同理 nums[right]*nums[right--];也是在nums[right]*nums[right]--。当然也可以写成:arr[index--] = nums[left]*nums[left];left++;arr[index--] = nums[right]*nums[right]; right--;

二、长度最小的子数组

209.最小长度的子数组 leetcode链接

1.方法概述

  • 滑动窗口的思想,当窗口的左边界位置start到窗口右边界位置end的和sum >=目标值target时,这就是最大窗口。然后想象这个最大窗口在一格一格的滑动,当该窗口滑动到数组最右端时,再通过比较和sum与目标值target的大小来判断是否能缩小该窗口的大小,最终返回窗口即为长度最小的连续子数组。

2.具体实现

Java实现版本

点击查看代码
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int start = 0;
int sum = 0;
int result = Integer.MAX_VALUE;
for(int end = 0;end < nums.length;end++){
sum += nums[end];
while(sum >= target){
int len = end - start + 1;
result = Math.min(result,len);
sum -= nums[start++];
}
}
return result == Integer.MAX_VALUE ? 0 : result;
}
}

3.要点总结

  • 本题的时间复杂度要求为O(n),用暴力解法两个for循环来不断寻找符合条件的子序列的时间复杂度O(n²)不满足题目要求,所以还是需要考虑双指针的思想,也就是本题的滑动窗口思想。
  • 本题的关键之处在于,窗口的起始位置和结束位置的设定和以及如何变动。如果for循环中的用窗口的起始位置start来索引,那么剩下的终止边界位置无法遍历。所以for循环中用窗口的结束位置end索引用来表示窗口的右边界位置并且用来遍历元素。如果当前窗口的和值sum >= 目标值target,则起始位置start就需要向后移动,也就是缩小最大窗口的过程,然后变更sum值。再来判断和值sum是否 >=目标值target,然后就是使用while循环来循环判断只要和值sum >= 目标值target,起始位置start就要移动。
  • 然后就是最小连续子序列的长度变更和返回。长度len就是窗口的起始位置start和结束位置end的差值,因为是数组长度所以还需要+1result本来定义int类型数组的最大值,也就是最坏情况下为所有元素和值sum才等于目标值target。所以只需把resultlen取小赋值给result就是最小的滑动窗口大小,也就是长度最小的连续子数组数组长度。如果没有满足的则返回0

三、螺旋矩形Ⅱ

59.螺旋矩阵 II leetcode链接

1.方法概述

  • 在控制是左闭右开的循环不变量原则下,按顺时针方向,从上端的从左至右-1处依次填充元素,再是从右端从上至下-1处依次填充元素,再是从下端从右至左-1处依次填充元素,最后是从左端从下至上-1处依次填充元素。然后依次一圈一圈的放入,当循环圈数 > n/2 时停止。如果是填充元素是基数的情况下进行单独赋值。

2.具体实现

Java实现版本

点击查看代码
class Solution {
public int[][] generateMatrix(int n) {
int loop = 0;
int[][] arr = new int[n][n];
int start = 0;
int count = 1;
int i,j; while(loop++ < n/2){
for(j = start; j< n-loop;j++){
arr[start][j] = count++;
} for(i = start;i< n-loop;i++){
arr[i][j] = count++;
} for(;j >= loop;j--){
arr[i][j] = count++;
} for(;i >= loop;i--){
arr[i][j] = count++;
}
start++;
}
if(n % 2 == 1){
arr[start][start] = count;
}
return arr;
}
}

3.要点总结

  • 关于循环多少loop圈,通过示例观察不难发现,图形为nn的矩阵,则填充圈数为n/2,则循环填充的次数也为loop圈。每进一次while循环loop++一次,再判断是否 < n/2。如果大于则不进入循环。
  • 关于填充的规则,矩形有四边,按照二维数组从上到下,从左到右分别定义为i下标和j下标。从上边从左端第一个元素开始,每次转角的元素交给下一边来填充,这样就不会导致填充混乱。从矩形上侧,第一层i是不变的即为定义的start初始值即可,j也是从start定义的初始值开始循环遍历,因为每个转角的元素值都交给下一侧的循环进行填充,所j < n - loop,将arr[start][j] = count++;。从矩形右侧从上往下,j的已近为最右侧边界下标,所以j不变,istart初始值开始for循环遍历,将arr[i][j] = count++;。然后从矩形的下侧,从右往左,i是不变的,j的初值就是上次循环后的j值,然后j--,当j >= loop时停止循环,因为第一圈loop此时还等于1,此时j的最小值必须保证是1才能确保转角元素没有被赋值给数组arr,然后将arr[i][j]=count++;。从矩形左侧从下至上,j是不变的,当i >= loop时停止循环,然后i--,最后将 arr[i][j] = count++;。然后关键的一步是loop需要while循环处++
  • 关于基数中心点的,因为start的值也跟着填充循环发生改变,所以最后的中心点就可以将arr[start][start] = count;即可。

仅供个人参考,欢迎批评指正!

有序数组的平方&长度最小的子数组&螺旋矩阵Ⅱ的更多相关文章

  1. 双指针之滑动窗口(长度最小的子数组 和 和为s的连续正数序列)

    双指针之滑动窗口 (长度最小的子数组:和为s的连续正数序列) 1, 什么时候使用? (与子数组/字符串 有关的题目)~如果给了某个具体值的target,即用滑动窗口 不然就双指针(一般做法,左边< ...

  2. [Swift]LeetCode209. 长度最小的子数组 | Minimum Size Subarray Sum

    Given an array of n positive integers and a positive integer s, find the minimal length of a contigu ...

  3. 209. 长度最小的子数组--LeetCode

    来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/minimum-size-subarray-sum 著作权归领扣网络所有.商业转载请联系官方授权,非商业 ...

  4. leetcode-977. 有序数组的平方

    leetcode-977. 有序数组的平方 (来自 120周赛) 题意 给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序. 示例 1: 输入:[-4,-1 ...

  5. LeetCode977. 有序数组的平方

    问题:977. 有序数组的平方 给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序. 示例 1: 输入:[-4,-1,0,3,10] 输出:[0,1,9,1 ...

  6. GCJ:2008 Round1AA-Minimum Scalar Product(有序数组倒序乘积和最小)

    题目链接:https://code.google.com/codejam/contest/32016/dashboard#s=p0 Minimum Scalar Product This contes ...

  7. 代码随想录第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

    2022/09/22 第二天 第一题 这题我就直接平方后排序了,很无脑但很快乐啊(官方题解是双指针 第二题 滑动窗口的问题,本来我也是直接暴力求解发现在leetCode上超时,看了官方题解,也是第一次 ...

  8. 找一个数组的最大和的连续子数组(时间复杂度 O(n))

    设计思想 一开始的思想是求出全部的情况,再分别比较大小,这种方法适用于有限个数组,不适用于输入数组长度和内容的情况. 但也试着做了 int a[]= {-1,2,6,-10}; int size=4; ...

  9. 查找二维数组list[][]中的最大的子数组的和

    之前做过最大一维数组子数组的和的题目,现在将数组扩展成二维: 代码如下: #include<iostream> #define null -858993460 using namespac ...

  10. 找一个数组的最大和的连续子数组(时间复杂度 O(n))(二)

    要求: 要求数组从文件读取. 如果输入的数组很大,  并且有很多大的数字,  就会产生比较大的结果 (考虑一下数的溢出), 请保证你的程序能正常输出. 另外, 如果输入文件的参数有错误, 这个程序应该 ...

随机推荐

  1. docker和docker-compose便捷安装

    安装docker: curl -fsSL get.docker.com -o get-docker.sh&&sh get-docker.sh 或: curl -sSL https:// ...

  2. NOIP 口胡

    因为没准备啥东西 这两天口胡一下近年 NOIP 的题 大概会一道不落?没什么很寄的考点主要是 2021 T1 报数 打一个 \(O(\log n)\) 查询 \(n\) 中是否有 \(7\),打一个类 ...

  3. 通过Shell脚本自动安装Hive&JDBC测试&提供CDH5网盘地址

    〇.参考地址 1.Linux下编写脚本自动安装hive https://blog.csdn.net/weixin_44911081/article/details/121227024?ops_requ ...

  4. 【软考-中级-数据库相关知识】03、SQL语言

    SQL语言 查询 允许出现聚集函数的是:select子句和having子句 权限管理 语法:GRANT XXX ON TABLE TO USER WITH GRANT OPTION 存储过程和函数 函 ...

  5. 【Java SE】Day08 String类、static关键字、Arrays类、Math类

    一.String类 1.概述 所有双引号字符串,都是String类的对象 字符串常量,会存在字符串常量池中 2.创建 构造函数--空构造.字符数组.字节(byte ASCII码)数组 3.常用方法-- ...

  6. 彻底理解Python中的闭包和装饰器(下)

    上篇讲了Python中的闭包,本篇要讲的装饰器就是闭包的一个重要应用. 如果你还不知道什么是闭包,猛戳这里阅读:彻底理解Python中的闭包和装饰器(上) 什么是装饰器 装饰器的作用是在不修改函数定义 ...

  7. MySQL简介、下载、密码修改及基本使用

    目录 存取数据的演变史 数据库软件应用史 数据库的本质 数据库的分类 MySQL简介 MySQL基本使用 系统服务的制作 密码相关操作 SQL与NoSQL 数据库重要概念 基本SQL语句 存取数据的演 ...

  8. APP异常测试点汇总

    在测试APP时异常测试是非常必要的. 安装卸载中的异常测试 一.安装 安装过程中设备重启 安装过程中息屏 安装过程中断网 安装过程中切换网络 安装过程中收到短信提醒 安装过程中收到来电提醒 安装过程中 ...

  9. js获取当前年月日时分

    function GetDate(){ var now = new Date(); var year = now.getFullYear(); //年 var month = now.getMonth ...

  10. @LoadBalanced注解原理

    在使用springcloud ribbon客户端负载均衡的时候,可以给RestTemplate bean 加一个@LoadBalanced注解,就能让这个RestTemplate在请求时拥有客户端负载 ...