首页 > 其他分享 >day 2 数组 977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵 Ⅱ

day 2 数组 977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵 Ⅱ

时间:2023-10-27 18:57:11浏览次数:35  
标签:977 59 nums int min result 数组 窗口

977.有序数组的平方

题目链接:977.有序数组的平方

视频教程

文章教程

思路

  • 最直观的解法:

    暴力解题,每个数先平方,然后再快速排序,时间复杂度为 O(n + nlog n)

  • 规律:

    该数组本身是非递减顺序,在平方后其实依然有顺序,左右两边大中间小

双指针

利用观察到的规律,可以利用双指针在数组的两头寻找最大的元素,将其放到新创建的数组中

解法:

  • 定义两个指针,i 指向起始位置,j 指向终止位置

  • 定义一个新数组 result,长度和 nums 一样,让 k 指向 result数组的终止位置

  • 循环条件为 i <= j ,保证最后一个元素能够被处理移至新数组

  • nums[i] * nums[i] > nums[j] * nums[j] 那么 result[k--] = nums[i] * nums[i++]

    nums[i] * nums[i] <= nums[j] * nums[j] 那么 result[k--] = nums[j] * nums[j--]

代码实现

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

209.长度最小的子数组

题目链接:209.长度最小的子数组

视频教程

文章教程

滑动窗口

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

滑动窗口其实也可以理解为双指针的一种,只不过这种解法更像是一个窗口在移动,所以叫滑动窗口更合适一点

本题中实现滑动窗口,主要是确定如下三点:

  • 窗口内是什么?

  • 如何移动窗口的结束位置(快指针)?

  • 如何移动窗口的起始位置(慢指针)?

解决思路:

  • 窗口:满足 其和 >= target 的长度最小的连续子数组
  • 窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里面的索引
  • 窗口的起始位置如何移动:如果窗口内的值 >= target 了,窗口的起始位置就要向前移动直到窗口内的值 < target
while (sum >= target) {
    tmp = fast - slow + 1;
    min = Math.min(min, tmp);
    sum -= nums[slow++]; 
}

如何动态调节滑动窗口的起始位置是本题的精华

代码实现

时间复杂度:O(n) 2 * n

空间复杂度:O(1)

class Solution {
    public int minSubArrayLen(int target, int[] nums) {
        int min = Integer.MAX_VALUE;
        int slow = 0;
        int sum = 0;
        int tmp = 0;
        for (int fast = 0;fast < nums.length;fast++) {
            sum += nums[fast];
            while (sum >= target) {
                tmp = fast - slow + 1;
                min = Math.min(min, tmp);
                sum -= nums[slow++]; 
            }
        }
        return min == Integer.MAX_VALUE ? 0 : min;
    }
}

59.螺旋矩阵 Ⅱ

题目链接:59.螺旋矩阵 Ⅱ

视频链接

文章链接

思路

  • 难点:本题不涉及什么算法,但十分考察过程,对于每一圈的边界不好处理

  • 解决方式:坚持 循环不变量原则 ,类似 二分法 中坚持 左闭右开

  • 过程:由外向内地循环每一圈 ,下面四个循环的边界都坚持左闭右开,这样可以避免重复填充或露填充

    • 左上到右上 [不变][递增]
    • 右上到右下 [递增][不变]
    • 右下到左下 [不变][递减]
    • 左下到左上 [递减][不变]

这里引用carl哥的图来解释说明:(图画的贼清晰)

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

代码实现

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] result = new int[n][n];
        int count = 1; // 递增计数
        int start = 0; // 每一圈的起始位置,每圈从(start, start)开始
        int i,j; // 方便写下面四个循环
        for (int loop = 1;loop <= n / 2;loop++) {
            // 模拟上侧从左到右
            for (j = start;j < n - loop;j++) {
                result[start][j] = count++;
            }
            // 模拟右侧从上到下
            for (i = start;i < n - loop;i++) {
                result[i][j] = count++;
            }
            // 模拟下侧从右到左
            for (;j >= loop;j--) {
                result[i][j] = count++;
            }
            // 模拟左侧从下到上
            for (;i >= loop;i--) {
                result[i][j] = count++;
            }

            start++;
        }

        // 如果n为奇数,需要单独给最中间的位置赋值
        if (n % 2 == 1) {
            result[start][start] = count;
        }
        return result;
    }
}

标签:977,59,nums,int,min,result,数组,窗口
From: https://www.cnblogs.com/bobochicken/p/17792983.html

相关文章

  • 26. 删除有序数组中的重复项
    1.题目介绍给你一个非严格递增排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。然后返回nums中唯一元素的个数。考虑nums的唯一元素的数量为k,你需要做以下事情确保你的题解可以被通过:更......
  • 二维数组根据其下标,判断它是第几个元素【i * col + j】
    二维数组根据其下标,判断它是第几个元素33022121221publicclassqqqq{staticintrow;staticintcol;publicstaticvoidmain(String[]args){Scannerin=newScanner(System.in);row=in.nextInt();col=in.nextI......
  • JavaScript 数组存储方式及对象
    一、数组的存储1、当声明一个变量时,vara=111;在后台计算机翻译时,var声明a变量所以此时会产生一个栈内存,变量a的初始值为undefined,然后=111;undefined消失,111的值被赋值给了a。如果多个变量赋值的话,栈内存的执行顺序是先进后出的顺序。也叫做压栈。栈内存属于基础数据......
  • 2059:【例3.11】买笔
    2059:【例3.11】买笔时间限制:1000ms      内存限制:65536KB提交数:50326   通过数:26989【题目描述】期末来临了,班长小Q决定将剩余班费xx元钱,用于购买若干支钢笔奖励给一些学习好、表现好的同学。已知商店里有三种钢笔,它们的单价为66元、55元和44元。小Q......
  • 照灯烘干机UL859亚马逊海外拼多多电商出口
    照灯烘干机UL859亚马逊海外拼多多电商出口办理Ul是美国保险商试验所(UnderwritersLaboratorieslnc)的简写。UL安全试验所是美国最有权威的,也是世界上从事安全试验和鉴定的较大的民间机构。它是一个独立的、营利的、为公共安全做试验的专业机构。它采用科学的测试方法来研究确定各......
  • Jquery 将 JSON 列表的 某个属性值,添加到数组中,并判断一个值,在不在数据中
    jquery将JSON列表的某个属性值,添加到数组中如果你有一个JSON列表,并且想要将每个对象的某个属性值添加到数组中,你可以使用jQuery的$.each()函数来遍历JSON列表,并获取所需的属性值。以下是一个示例代码:varjsonList=[{"name":"John","age":30,"city":"NewYork"}......
  • 代码随想录算法训练营第一天 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩
    今日学习的文章链接和视频链接https://programmercarl.com/0977.有序数组的平方.htmlhttps://programmercarl.com/0209.长度最小的子数组.htmlhttps://programmercarl.com/0059.螺旋矩阵II.html977.有序数组的平方菜鸡刚开始只会暴力,记录一下双指针:varsortedSquares=......
  • java数组 去重字符串去空格
    packagegta.custom.action.typeForm;importjava.util.ArrayList;publicclassTestmain{publicstaticvoidmain(Stringargs[]){String[]str={"2","2","3","1","4","4"};/......
  • #yyds干货盘点# LeetCode程序员面试金典:最小操作次数使数组元素相等 II
    题目给你一个长度为n的整数数组nums,返回使所有数组元素相等需要的最小操作数。在一次操作中,你可以使数组中的一个元素加1或者减1。 示例1:输入:nums=[1,2,3]输出:2解释:只需要两次操作(每次操作指南使一个元素加1或减1):[1,2,3] => [2,2,3] => [2,2,2]示......
  • 易混知识 | 数组指针 VS 指针数组
    ⛩️博主主页:@威化小餅干......