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

news2024/11/15 17:56:09

打卡第二天,认真做了两道题目,顶不住了好困,明天早上练完车回来再重新看看。

今日任务

第一章数组

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

977.有序数组的平方

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

示例 1:
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]
示例 2:
输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]

提示:

  • 1 <= nums.length <= 1 0 4 10^4 104
  • − 1 0 4 -10^4 104 <= nums[i] <= 1 0 4 10^4 104
  • nums 已按 非递减顺序 排序
    进阶:
  • 请你设计时间复杂度为 O(n) 的算法解决本问题

我的解题

暴力做法

void quick_sort(vector<int> &q, int l, int r) {
    if(l >= r) return;
    int i = l - 1, j = r + 1, x = q[(l + r) >> 1];
    while(i < j) {
        do i++; while(q[i] < x);
        do j--; while(q[j] > x);
        if(i < j) swap(q[i], q[j]);
    }
    quick_sort(q, l, j);
    quick_sort(q, j + 1, r);
}
vector<int> sortedSquares(vector<int>& nums) {
    for(int i = 0; i < nums.size(); i++) nums[i] *= nums[i];
    quick_sort(nums, 0, nums.size() - 1);
    // sort(nums.begin(), nums.end());
    return nums;
}

看完题目第一想法,暴力把数组每一个数的平方先的出来,然后快排。

双指针做法

vector<int> sortedSquares(vector<int>& nums) {
    vector<int> res(nums.size(), 0);
    int z = 0;
    while(z < nums.size() && nums[z] < 0) ++z;
    int k = 0, i = z - 1, j = z;
    while(i >= 0 && j < nums.size()) {
        if(nums[i] * nums[i] <= nums[j] * nums[j]) {
            res[k++] = nums[i] * nums[i];
            i--;
        } else {
            res[k++] = nums[j] * nums[j];
            j++;
        }
    }
    while(i >= 0) {
            res[k++] = nums[i] * nums[i];
            i--;
    }
    while(j < nums.size()){
            res[k++] = nums[j] * nums[j];
            j++;
    }
    return res;
}

双指针想法,因为是非递减数组,有正数负数,平方之后中间的数小,两边的大。

  • 新建一个数组res,存放结果。
  • 找到第一个正数下标z,因为是非递减数组,所以从这个数开始分成两边,平方之后左边 <- 越来越大,右边 -> 越来越大,
  • 比较 n u m s [ i ] ( i = z − 1 ) , n u m s [ j ] ( j − z ) nums[i] (i = z - 1),nums[j] (j - z) nums[i](i=z1)nums[j](jz)下标的值的平方哪个更小,小的存入结果数组res,移动指针。如果 n u m s [ i ] ∗ n u m s [ i ] < n u m s [ j ] ∗ n u m s [ j ] nums[i] * nums[i]< nums[j] * nums[j] nums[i]nums[i]<nums[j]nums[j], 将 n u m s [ i ] ∗ n u m s [ i ] nums[i] * nums[i] nums[i]nums[i] 存入 res, i 往左边移动一格。
  • 当i,j 某一个指针到了边界,将另外一个还没到边界的指针后面的值平方存到结果数组。注意 i ,j指针一个往左,一个往右。

看完卡哥的题解,发现自己把题目搞复杂了,直接在头尾两边定义指针,把大的平方数的指针指向的数的平方,存到结果数组(从后往前存放)就行,当指针相遇后结束就可以了。

代码随想录

看完卡哥的题解,

vector<int> sortedSquares(vector<int>& nums) {
    vector<int> res(nums.size(), 0);
    int i = 0, j = nums.size() - 1;
    int k = nums.size() - 1;
    for(int i = 0, j = nums.size() - 1; i <= j;) {
        if(nums[i] * nums[i] >= nums[j] * nums[j]) {
            res[k--] = nums[i] * nums[i];
            i++;
        } else {
            res[k--] = nums[j] * nums[j];
            j--;
        }
    }
    return res;
}

209.长度最小的子数组

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

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

提示:

  • 1 <= target <= 1 0 9 10^9 109
  • 1 <= nums.length <= 1 0 5 10^5 105
  • 1 <= nums[i] <= 1 0 5 10^5 105

题解

int minSubArrayLen(int target, vector<int>& nums) {
    int result = INT_MAX;
    int sum = 0; // 滑动窗口的值
    int hh = 0; // 滑动窗口的起始位置
    int length = 0; // 滑动窗口的长度
    for(int i = 0; i < nums.size(); i++) {
        sum += nums[i];
        while(sum >= target) {
            length = i - hh + 1;
            result = min(result, length);
            sum -= nums[hh++];
        }
    }
    if(result != INT_MAX) return result;
    else return 0;
}

这道题之前做过,也看过卡哥的视频,知道用滑动窗口,但是忘记怎么写了,又重新温习了一遍。

定义一个滑动窗口,把原数组的值加到窗口里面并且计算总值,当总值超过目标值,开始从窗口头缩小窗口,直到滑动数组的值不超过目标值,继续往窗口加原数组的值,直到遍历完数组。

59.螺旋矩阵II

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

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

在这里插入图片描述

示例2:
 输入:n = 1
输出:[[1]]

题解

vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> result(n, vector<int>(n, 0)); // 使用vector定义一个二维数组
        int startx = 0, starty = 0;
        int offset = 1; // 圈数缩小大小
        int count = 1;
        int i = 0, j = 0;
        int loop = n / 2; // 矩阵循环圈数
        int mid = n / 2;
        while(loop--) {
            i = startx;
            j = starty;
            for(j = starty; j < n - offset; j++) {
                result[startx][j] = count++;
            }
            for(i = startx; i < n - offset; i++) {
                result[i][j] = count++;
            }
            for(;j > starty; j--) {
                result[i][j] = count++;
            }
            for(; i > startx; i--) {
                result[i][starty] = count++;
            }
            startx++;
            starty++;
            offset++;
        }
        // 如果n为奇数的话,需要单独给矩阵最中间的位置赋值
        if (n % 2) {
            result[mid][mid] = count;
        }
        return result;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/351830.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

知识图谱构建技术综述

摘要 *知识图谱为实现语义化智能搜索以及知识互联打下了基础&#xff0c;。&#xff0c; *随着知识的发展&#xff0c;传统的基于模板和规则构建的知识图谱已经被深度学习所替代。 知识组织得原则中&#xff1a;知识的充分性、有序性和标准化规则。深度学习的效果在很大程度上…

线性神经网络(线性回归)

线性回归 目录线性回归导包生成数据集观察散点图读取数据集初始化模型参数定义模型定义损失函数定义优化算法训练简易实现(pytorch)生成数据集读取数据集定义模型初始化模型参数定义损失函数定义优化算法训练导包 import random import torch from d2l import torch as d2l生成…

微服务相关概念

一、谈谈你对微服务的理解&#xff0c;微服务有哪些优缺点&#xff1f;微服务是由Martin Fowler大师提出的。微服务是一种架构风格&#xff0c;通过将大型的单体应用划分为比较小的服务单元&#xff0c;从而降低整个系统的复杂度。优点&#xff1a;1、服务部署更灵活&#xff1…

Python pickle模块:实现Python对象的持久化存储

Python 中有个序列化过程叫作 pickle&#xff0c;它能够实现任意对象与文本之间的相互转化&#xff0c;也可以实现任意对象与二进制之间的相互转化。也就是说&#xff0c;pickle 可以实现 Python 对象的存储及恢复。值得一提的是&#xff0c;pickle 是 python 语言的一个标准模…

2023美赛A题:受旱灾影响的植物群落

文章目录背景要求服务词汇表背景 不同的植物对压力有不同的反应。例如&#xff0c;草原对干旱非常敏感。干旱以不同的频率和严重程度发生。大量的观察表明&#xff0c;不同物种的数量对植物群落如何在连续多代干旱周期中适应起到了重要作用。在一些仅有一种植物的群落中&#…

Vue基础13之浏览器本地存储、TodoList本地存储、组件自定义事件

Vue基础13浏览器本地存储localStorage 本地存储sessionStorage 会话存储总结TodoList本地存储App.vue组件自定义事件子组件给父组件传值使用props方法App.vueSchool.vue子组件给父组件传值使用组件自定义事件——绑定第一种写法&#xff1a;使用v-on或App.vueStudent.vue第二种…

idea快捷编码:生成for循环、主函数、判空非空、生成单例方法、输出;自定义快捷表达式

前言 idea可根据输入的简单表达式进行识别&#xff0c;快速生成语句 常用的快捷编码&#xff1a;生成for循环、主函数、判空非空、生成单例方法、输出 自定义快捷表达式 博客地址&#xff1a;芒果橙的个人博客 【http://mangocheng.com】 一、idea默认的快捷表达式查看 Editor…

String对象的创建和比较

String类的概述 String类&#xff1a;代表字符串。 Java 程序中的所有字符串字面值&#xff08;如 “abc” &#xff09;都作 为此类的实例实现。 String是JDK中内置的一个类&#xff1a;java.lang.string 。 String表示字符串类型&#xff0c;属于引用数据类型&#xff0c;不…

饲养员喂养动物-课后程序(JAVA基础案例教程-黑马程序员编著-第四章-课后作业)

【案例4-2】饲养员喂养动物 记得 关注&#xff0c;收藏&#xff0c;评论哦&#xff0c;作者将持续更新。。。。 【案例目标】 案例描述 饲养员在给动物喂食时&#xff0c;给不同的动物喂不同的食物&#xff0c;而且在每次喂食时&#xff0c;动物都会发出欢快的叫声。例如&…

Native扩展开发的一般流程(类似开发一个插件)

文章目录大致开发流程1、编写对应的java类服务2、将jar包放到对应位置3、配置文件中进行服务配置4、在代码中调用5、如何查看服务调用成功大致开发流程 1、编写服务&#xff0c;打包为jar包2、将jar包放到指定的位置3、在配置文件中进行配置&#xff0c;调用对应的服务 1、编…

linux 之 ps命令介绍

哈喽&#xff0c;大家好&#xff0c;我是有勇气的牛排&#xff08;全网同名&#xff09;&#x1f42e; 有问题的小伙伴欢迎在文末评论&#xff0c;点赞、收藏是对我最大的支持&#xff01;&#xff01;&#xff01;。 前言 如过想实现对进程监控&#xff0c;就需要使用到ps命…

macOS 13.3 Beta (22E5219e)发布

系统介绍2 月 17 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 13.3 开发者预览版 Beta 更新&#xff08;内部版本号&#xff1a;22E5219e&#xff09;&#xff0c;本次更新距离上次发布隔了 37 天。macOS Ventura 带来了台前调度、连续互通相机、FaceTime 通话接力…

Vue3+Lodash:2023年了,我依然在使用Lodash

目录 前言&#xff1a; 为什么选择lodash? 看看lodash的地位 如何使用lodash&#xff1f; 1.安装lodash 2.引入lodash 我们到底还需不需要lodash&#xff1f; 再举一些例子 前言&#xff1a; 前两天&#xff0c;在水群的时候&#xff0c;发现居然有人不知lodash&#…

OpenCV-PyQT项目实战(6)项目案例02:滚动条应用

欢迎关注『OpenCV-PyQT项目实战 Youcans』系列&#xff0c;持续更新中 OpenCV-PyQT项目实战&#xff08;1&#xff09;安装与环境配置 OpenCV-PyQT项目实战&#xff08;2&#xff09;QtDesigner 和 PyUIC 快速入门 OpenCV-PyQT项目实战&#xff08;3&#xff09;信号与槽机制 …

基于感知动作循环的层次推理用于视觉问答

title&#xff1a;Hierarchical Reasoning Based on Perception Action Cycle for Visual Question Answering 基于感知动作循环的层次推理用于视觉问答 文章目录title&#xff1a;[Hierarchical Reasoning Based on Perception Action Cycle for Visual Question Answering](…

机器学习技术:多任务学习综述!

Datawhale干货 作者&#xff1a;陈敬&#xff0c;中国移动云能力中心前言本文对多任务学习(multi-task learning, MTL)领域近期的综述文章进行整理&#xff0c;从模型结构和训练过程两个层面回顾了其发展变化&#xff0c;旨在提供一份 MTL 入门指南&#xff0c;帮助大家快速了解…

MySQL的锁机制详解

目录 一.概述 分类 锁的特性 二.MyISAM表锁 如何加表锁 读锁演示 写锁演示 三.InnoDB行锁 行锁特点 行锁模式 一.概述 锁是计算机协调多个进程或线程并发访问某一资源的机制&#xff08;避免争抢&#xff09;。 在数据库中&#xff0c;除传统的计算资源&#xff08;如…

常见的并发模型

介绍 常见解决并发的策略一般有两种&#xff1a;共享数据和消息传递 基于消息传递的实现有 CSP模型&#xff0c;典型的有Go语言中基于Channel的通讯Actor模型&#xff0c;典型的有Akka中的Actor模型 CSP模型和Actor模型的简单理解&#xff1a; Dont communicate by sharing…

如何使用MQTTX可视化工具

@ [TOC] 使用背景 最近在调试MQTT相关的程序,调试程序时使用的是MQTTX这个工具,它可以创建服务器连接,并且在连接后发布和订阅主题。在调试过程中总结了一些使用方法和技巧,在这里分享给大家。 MQTTX是EMQX公司推出的可视化MQTT调试工具,大家可以到官网下载使用,同时参…

技术实践干货:从零开始创建Node.js应用

作为一个程序员&#xff0c;我们常常会有很多想法和创意&#xff0c;然后用技术实现出来&#xff0c;这是一个很有成就感的事情。 在实践过程中&#xff0c;会发现很多想法都不能很好地落地&#xff0c;可能是技术、可能是团队氛围等等&#xff0c;于是就开始想着能够不能有一个…