LeetCode977.有序数组的平方(双指针法、暴力法、列表推导式)

LeetCode977.有序数组的平方

  • 1.问题描述
  • 2.解题思路
  • 3.代码
  • 4.知识点

1.问题描述

给你一个按 非递减顺序 排序的整数数组 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 <= 104
  • -104 <= nums[i] <= 104
  • nums 已按 非递减顺序 排序

进阶:

  • 请你设计时间复杂度为 O(n) 的算法解决本问题

2.解题思路

  1. 暴力排序:每个数平方之后,排个序。
    时间复杂度:这个时间复杂度是 O(n + nlogn), 可以说是O(nlogn)的时间复杂度
    空间复杂度:O(log⁡n)除了存储答案的数组以外,我们需要O(log⁡n)栈空间进行排序。
  2. 双指针法:数组有序,平方后,数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。那么使用双指针,i指向起始位置,j指向终止位置。定义一个数组result,和A数组一样的大小,让k指向result数组终止位置。
    如果A[i] * A[i] < A[j] * A[j] 那么result[k--] = A[j] * A[j];
    如果A[i] * A[i] >= A[j] * A[j] 那么result[k--] = A[i] * A[i];
    时间复杂度:O(n)。其中n 是数组nums的长度。
    空间复杂度:O(1)。除了存储答案的数组以外,我们只需要维护常量空间。
    在这里插入图片描述

3.代码

python:双指针法

from typing import Listclass Solution:def sortedSquares(self, nums: List[int]) -> List[int]:k = len(nums) - 1# 创建一个与输入列表长度相等的列表,用于存储结果res = [0] * len(nums)# 定义两个指针 i 和 j,分别指向列表的首尾i, j = 0, len(nums) - 1while i <= j:# 如果左边指针的平方大于右边指针的平方if nums[i] ** 2 > nums[j] ** 2:# 将左边指针的平方存入结果列表的末尾res[k] = nums[i] ** 2# 左边指针向右移动一位i += 1else:# 将右边指针的平方存入结果列表的末尾res[k] = nums[j] ** 2# 右边指针向左移动一位j -= 1# 结果列表的索引向前移动一位k -= 1# 返回结果列表return resarr = [-5, 3, 3, 4]
# 创建Solution类的实例
solution = Solution()
result = solution.sortedSquares(arr)
print(result)

python:暴力排序+列表推导法

class Solution:def sortedSquares(self, nums: List[int]) -> List[int]:return sorted(num * num for num in nums)

python:暴力排序

class Solution:def sortedSquares(self, nums: List[int]) -> List[int]:for i in range(len(nums)):nums[i] *= nums[i]nums.sort()return nums

C++:双指针法

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;class Solution {public:vector<int> sortedSquares(vector<int>& nums) {int k = nums.size() - 1;// 定义一个大小为原数组大小的,元素全部为 0 的新数组 resvector<int> res(nums.size(), 0);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--;}k--;}return res;}
};int main() {Solution solution;vector<int> nums = {-4, -1, 0, 3, 10};vector<int> result = solution.sortedSquares(nums);cout << "Sorted Squares: ";for (int num : result) {cout << num << " ";}cout << endl;return 0;
}

C++:暴力法

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;class Solution {public:vector<int> sortedSquares(vector<int>& nums) {for(int i = 0; i < nums.size(); i++) {nums[i] *= nums[i];}sort(nums.begin(), nums.end());return nums;}
};int main() {Solution solution;vector<int> nums = {-4, -1, 0, 3, 10};vector<int> result = solution.sortedSquares(nums);cout << "Sorted Squares: ";for (int num : result) {cout << num << " ";}cout << endl;return 0;
}

4.知识点

  1. 结果数组初始化
    pythonres = [0] * len(nums)是为了在循环中通过索引直接赋值给 res 的对应位置,以避免在循环中直接赋值,避免数组越界的情况。如果代码为res=[],res 是一个空列表,无法通过索引来直接进行赋值。因此,我们将 res 初始化为一个长度为 len(nums) 的列表,每个元素都初始化为 0。然后在循环中通过索引 kres 进行赋值操作,把平方数按照逆序的方式存入 res 中。这样最后返回的 res 列表就是按照平方数递减顺序排列的结果。

    C++vector<int> res(nums.size(), 0); 创建一个大小与 nums 数组相等的向量 res,并将其所有元素初始化为 0。这样做是为了确保 res 向量的大小与 nums 数组一致,以便在后续的操作中能够正确地将平方值存储在正确的位置。如果使用 vector<int> res; 来创建 res 向量,那么这个向量的大小将为 0,也就是空向量。在后续的索引赋值操作中,代码将会尝试将平方值存储在 res 向量的位置上,但是由于向量是空的,将无法执行这个操作。

  2. 函数声明:-> 用于指定函数的返回值类型,在 List[int] 中,List 是返回值类型的一种注释,表示一个列表,int 则是列表中的元素类型,表示整数类型。

    def function_name(parameters: type) -> return_type:# 函数体return value
    
  3. from typing import List 语句的作用是导入 List 类型typing 模块提供了一组用于类型提示的类和函数,帮助开发者更好地定义函数参数、返回值的类型,提高代码的可读性、可靠性和可维护性。

  4. python列表推导式 [expression for item in iterable if condition]
    其中,expression表示参与列表生成的表达式,可包含变量、函数调用等操作;item表示生成列表中的元素;iterable表示可迭代的对象,例如列表、元组、集合等;if condition表示对条件的筛选,可以省略。

  5. C++ sort函数:sort(v.begin(),v.end(),cmp)
    它是用来对一组序列进行排序的。sort函数进行排序的时间复杂度为n*log2n,比冒泡之类的排序算法效率要高,包含在头文件为#include的c++标准库中。 其有三个参数,前两个参数是待排序区间;第三个参数可有可无(第三个参数代表比较规则),没有第三个参数的时候,sort()默认按升序排列,有第三个参数的时候,可以通过这个参数实现各种各样的排序,包括降序。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

竞赛选题 行人重识别(person reid) - 机器视觉 深度学习 opencv python

文章目录 0 前言1 技术背景2 技术介绍3 重识别技术实现3.1 数据集3.2 Person REID3.2.1 算法原理3.2.2 算法流程图 4 实现效果5 部分代码6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习行人重识别(person reid)系统 该项目…

虚拟机配置网络ip,主打一个详细

文章目录 一、前言二、安装vim编辑器三、检查联网状态1. 使用ping命令 四、查看ip五、ens33网卡六、开机启动ens33网卡七、获取子网地址和子网掩码八、配置网关与子网掩码1. 编辑虚拟网络信息2. 配置网关3. 配置ens33网卡信息 九、动态ip配置十、静态ip配置 一、前言 本文主要…

Linux ps -ef|grep去除 grep --color=auto信息

linux 监控 进程判断是否启动可通过该指令实现 ps -ef|grep java指令结果为 # -v 参数有过滤作用 ps -ef|grep java |grep -v grep

Redis事务+秒杀案例

Redis事务是一个单独的隔离操作&#xff0c;是指将多条命令放在一个命令队列当中&#xff0c;按顺序执行&#xff0c;保证多个命令在同一个事务中执行而不受其他客户端的影响。 通俗来说就是&#xff1a;串联多个命令防止别的命令插队。 1.Multi、Exec、discard 在输入Multi命…

nginx配置-超详细

背景 安装nginx之后&#xff0c;会自动生成很多的文件&#xff0c;但是nginx.conf这个文件是我们的核心&#xff0c;如何去正确的修改和优化它是nginx的核心。在配置之前&#xff0c;需要看懂它的配置。鉴于经常需要配置&#xff0c;再次记录一下 一、nginx的默认配置 #user …

【C++】类和对象(6)--运算符重载

目录 一 概念 二 运算符重载的实现 三 关于时间的所有运算符重载 四 默认赋值运算符 五 const取地址操作符重载 一 概念 C为了增强代码的可读性引入了运算符重载&#xff0c;运算符重载是具有特殊函数名的函数&#xff0c;也具有其返回值类型&#xff0c;函数名字以及参数…

【UE】线框材质

一、方式1 新建一个材质&#xff0c;混合模式设置为“已遮罩”&#xff0c;勾选“双面” 勾选“线框” 然后可以随便给一个自发光颜色&#xff0c;这样最基本的线框材质就完成了 二、方式2 新建一个材质&#xff0c;混合模式设置为“已遮罩”&#xff0c;勾选“双面”&#x…

计算机算法分析与设计(24)---分支限界章节复习

文章目录 一、分支界限法介绍二、旅行商问题应用三、装载问题应用3.1 问题介绍与分析3.2 例题 四、0-1背包问题应用4.1 问题介绍与分析4.2 例题 一、分支界限法介绍 二、旅行商问题应用 三、装载问题应用 3.1 问题介绍与分析 3.2 例题 四、0-1背包问题应用 4.1 问题介绍与分析…

读像火箭科学家一样思考笔记05_思想实验

1. 思想实验室 1.1. 思想实验至少可以追溯到古希腊时期 1.1.1. 从那时起&#xff0c;它们就跨越各个学科&#xff0c;在哲学、物理学、生物学、经济学等领域取得重大突破 1.1.2. 它们为火箭提供动力&#xff0c;推翻政府&#xff0c;发展进化生物学&#xff0c;解开宇宙的奥…

2023.11.19使用flask制作一个文件夹生成器

2023.11.19使用flask制作一个文件夹生成器 实现功能&#xff1a; &#xff08;1&#xff09;在指定路径上建立文件夹 &#xff08;2&#xff09;返回文件夹的路径和建立成功与否的提示 main.py import os from flask import Flask, request, jsonify, render_templateapp F…

CNP实现应用CD部署

上一篇整体介绍了cnp的功能&#xff0c;这篇重点介绍下CNP产品应用开发的功能。 简介 CNP的应用开发&#xff0c;主要是指的应用CD部署的配置管理。 应用列表&#xff0c;用来创建一个应用&#xff0c;一般与项目对应&#xff0c;也可以多个应用对应到一个项目。具体很灵活。…

Netty源码学习4——服务端是处理新连接的netty的reactor模式

零丶引入 在前面的源码学习中&#xff0c;梳理了服务端的启动&#xff0c;以及NioEventLoop事件循环的工作流程&#xff0c;并了解了Netty处理网络io重要的Channel &#xff0c;ChannelHandler&#xff0c;ChannelPipeline。 这一篇将学习服务端是如何构建新的连接。 一丶网络包…

【STM32】W25Q64 SPI(串行外设接口)

一、SPI通信 0.IIC与SPI的优缺点 https://blog.csdn.net/weixin_44575952/article/details/124182011 1.SPI介绍 同步&#xff08;有时钟线&#xff09;&#xff0c;高速&#xff0c;全双工&#xff08;数据发送和数据接收各占一条线&#xff09; 1&#xff09;SCK:时钟线--&…

【数据结构】栈和队列的模拟实现

前言&#xff1a;前面我们学习了单链表并且模拟了它的实现&#xff0c;今天我们来进一步学习&#xff0c;来学习栈和队列吧&#xff01;一起加油各位&#xff0c;后面的路只会越来越难走需要我们一步一个脚印&#xff01; &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x…

Golang基础-面向对象篇

文章目录 struct结构体类的表示与封装类的继承多态的基本要素与实现interface空接口反射变量的内置pairreflect包解析Struct TagStruct Tag在json中的应用 struct结构体 在Go语言中&#xff0c;可以使用type 关键字来创建自定义类型&#xff0c;这对于提高代码的可读性和可维护…

win11,引导项管理

1&#xff0c;打开cmd,输入msconfig 2,进入引导选项卡 3&#xff0c;删除不需要的引导项

ETL-使用kettle批量复制sqlserver数据到mysql数据库

文章标题 1、安装sqlserver数据库2、下载kettle3、业务分析4、详细流程&#xff08;1&#xff09;转换1&#xff1a;获取sqlserver所有表格名字&#xff0c;将记录复制到结果&#xff08;2&#xff09;转换2&#xff1a;从结果设置变量&#xff08;3&#xff09;转换3&#xff…

【Linux】:共享内存

共享内存 一.原理二.创建共享内存1.shmget2.写一个共享内存代码 三.进行通信1.各种接口2.各接口使用代码3.一次简单的通信四.共享内存的特点 一.原理 直接原理 共享内存顾名思义就是共同使用的一块空间。 很明显操作系统需要对这块内存进行管理&#xff0c;那么就避免不了先描…

Servlet执行流程Servlet 生命周期

Servlet 生命周期 对象的生命周期指一个对象从被创建到被销毁的整个过程 import javax.servlet.*; import javax.servlet.annotation.WebServlet; import java.io.IOException; WebServlet(urlPatterns "/demo",loadOnStartup 10) public class ServletDemo imple…

华为ac+fit漫游配置案例

Ap漫游配置: 其它配置上面一样,ap管理dhcp和业务dhcp全在汇聚交换机 R1: interface GigabitEthernet0/0/0 ip address 11.1.1.1 255.255.255.0 ip route-static 12.2.2.0 255.255.255.0 11.1.1.2 ip route-static 192.168.0.0 255.255.0.0 11.1.1.2 lsw1: vlan batch 100 200…