IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 代码随想录算法训练营第二天 | 977.有序数组的平方 、209.长度最小的子数组、 59.螺旋矩阵II -> 正文阅读

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

代码随想录

[注:题目来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/minimum-size-subarray-sum]


目录

977.有序数组的平方

209. 长度最小的子数组

59. 螺旋矩阵 II


今天还是给老板弄了一天申请书,麻了。时间紧,任务重,就浅二刷了一下977和209,59明早补上。

977.有序数组的平方

给你一个按?非递减顺序?排序的整数数组?nums,返回?每个数字的平方?组成的新数组,要求也按?非递减顺序?排序。

输入:nums = [-4,-1,0,3,10]

分析可知,数组元素平方后是由外到内递减的,故可以考虑从数组两端向中间遍历,即使用双指针分别指向首尾。

/**
     * 977. 有序数组的平方
     * @param nums  非递减顺序 排序的整数数组
     * @return 返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序
     */
    public static int[] sortedSquares(int[] nums) {
        //输入:nums = [-4,-1,0,3,10]  输出:[0,1,9,16,100]
        int[] array = new int[nums.length];
        int left = 0;
        int right = nums.length - 1;
        int index = nums.length - 1;
        // 分析可知,数组元素平方值由两端向中间减少,故可使用双指针,一个指针指向首端,一个指针指向尾端
        while (left <= right){ // 循环结束条件是两指针相遇
            if (nums[left] * nums[left] <= nums[right] * nums[right]){
                array[index] = nums[right] * nums[right];
                right--;
            }else {
                array[index] = nums[left] * nums[left];
                left++;
            }
            index--;
        }
        return array;

209. 长度最小的子数组

给定一个含有?n?个正整数的数组和一个正整数 target 。

找出该数组中满足其和 ≥ target 的长度最小的 连续子数组?[numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

一刷是直接两个for暴力解决,二刷时考虑使用一个for解决战斗,即滑动窗口(核心还是双指针)。这里一个指针用来遍历整个数组(即用来确定终点),另一个指针用于滑动窗口,即当窗口值大于s后减去最左边的值,使窗口右移。

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

  • 窗口内是什么?
  • 如何移动窗口的起始位置?
  • 如何移动窗口的结束位置?

窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。

窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。这里就是用来比较每次窗口值大于s后的子数组长度。

窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。

滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)暴力解法降为O(n)。

/**
     * 209. 长度最小的子数组
     * @param target 正整数
     * @param nums n 个正整数的数组
     * @return 返回该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] 的长度。
     */
    public static int minSubArrayLen(int target, int[] nums) {
        //输入:target = 7, nums = [2,3,1,2,4,3]    输出:2
        int sum = 0;
        int len = nums.length + 1;
        int temp;
        int j = 0;
        for (int i = 0; i < nums.length; i++) {
            sum += nums[i];
            // 这里就是滑动窗口的核心
            while (sum >= target){
                temp = i - j + 1;
                len = Math.min(len, temp);
                sum -= nums[j];
                j++;
            }
        }
        if (len == nums.length + 1){
            return 0;
        }
        return len;

补上59. 螺旋矩阵 II

59. 螺旋矩阵 II

给你一个正整数?n?,生成一个包含?1?到?n2?所有元素,且元素按顺时针顺序螺旋排列的?n x n?正方形矩阵?matrix?。

输入:n = 3  输出:[[1,2,3],[8,9,4],[7,6,5]]

这道题的核心是遍历矩阵,可坐标系来描述矩阵元素的位置,即使用双指针,一个指针i表示x轴(行),一个指针j表示y轴(列)。同时对于矩阵每条边上元素的赋值需要一个统一的规则,即循环不变量(即区间,这里使用左闭右闭区间)。

下次更上n*m矩阵。

?

/**
     * 59. 螺旋矩阵 II
     * @param n 一个正整数 n
     * @return 返回一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix
     */
    public static int[][] generateMatrix(int n) {
        // 输入:n = 3 输出:[[1,2,3],[8,9,4],[7,6,5]]
        // 双指针+循环不变量
        int i ;// 行
        int j ;// 列
        int loop = 0;
        int start = 0;
        int count = 1;
        int[][] matrix = new int[n][n];
        while (loop++ < n / 2){
            // 上侧从左到右
         //这里的区间取的是[start, i],每条边的循环不变量都是2,对于第一层循环即是[0, 2]
            for (i = start; i < n - loop; i++) {
                matrix[start][i] = count++;
            }
            // 右侧从上到下
            for (j = start; j < n - loop; j++) {
                matrix[j][i] = count++;
            }
            // 下侧从右到左
            for (; i >= loop; i--) {
                matrix[j][i] = count++;
            }
            //左侧从下到上
            for (; j >= loop; j--) {
                matrix[j][i] = count++;
            }
            start++;
        }
        if (n % 2 == 1){
            matrix[start][start] = count;
        }
        return matrix;

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-09-24 21:19:25  更:2022-09-24 21:23:00 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 17:53:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码