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 List


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


arr = [-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 的新数组 res
			vector<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()默认按升序排列,有第三个参数的时候,可以通过这个参数实现各种各样的排序,包括降序。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

要事第一:如何通过6个步骤确定项目的优先级

当收到很多项目请求并且每个请求都是重中之重时&#xff0c;该怎么办&#xff1f;从最易完成的开始&#xff1f;还是先解决最大的问题&#xff1f; 实际上两种做法都不对。确定项目优先级的更好方法是评估以下内容&#xff0c;而不是关注项目规模或完成时长&#xff1a; ● 每…

3.8-镜像的发布

如果我们想将image push到docker hub里面&#xff0c;那么我们的image的名字一定要是这种格式&#xff1a;docker hub id/imageName&#xff0c;例如&#xff1a;lvdapiaoliang/hello-docker docker hub个人账户设置地址&#xff1a; 在push之前要先登录&#xff1a; docker l…

pycharm2023 实现鼠标点击某行,调试时代码运行至相应行

按下图取消 Breakpoints Over Line Numbers即可&#xff0c;然后调试时点击某行&#xff0c;代码就会运行至某行

AcWing 717. 简单斐波那契

原题链接 题目 以下数列 0 1 1 2 3 5 8 13 21 … 被称为斐波纳契数列。 这个数列从第 3 项开始&#xff0c;每一项都等于前两项之和。 输入一个整数 N &#xff0c;请你输出这个序列的前 N 项。 输入格式 一个整数 N 。 输出格式 在一行中输出斐波那契数列的前 N 项&…

Nosql之redis概述及基本操作

关系数据库与非关系型数据库概述 关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上&#xff0c;一般面向于记录。SQL语句(标准数据查询语言)就是一种基于关系型数据库的语言&#xff0c;用于执行对关系型…

HTTP四种请求方式,状态码,请求和响应报文

1.get请求 一般用于获取数据请求参数在URL后面请求参数的大小有限制 2.post请求 一般用于修改数据提交的数据在请求体中提交数据的大小没有限制 3.put请求 一般用于添加数据 4.delete请求 一般用于删除数据 5.一次完整的http请求过程 域名解析&#xff1a;使用DNS协议…

数据结构-插入排序

插入排序 插入排序的三种常见方法&#xff1a; 直接插入排序、折半插入排序、希尔排序。 数据存储结构 因为我们是用的是C语言来实现算法&#xff0c;因此我们需要创建一个结构体&#xff0c;用来存放初始数据。 结构体定义如下&#xff1a; #define MAX 100 typedef int…

Spring Framework IOC依赖查找 - 按类型查找解析

目录 在Spring框架中&#xff0c;控制反转&#xff08;IoC&#xff09;是一种设计模式&#xff0c;它通过将对象的创建和管理交给容器来实现。依赖查找是IoC的一部分&#xff0c;它允许你从容器中查找所需的依赖项。按类型进行依赖查找是其中的一种方式&#xff0c;今天来讲Spr…

笔记57:双向循环神经网络

本地笔记地址&#xff1a;D:\work_file\DeepLearning_Learning\03_个人笔记\3.循环神经网络\第9章&#xff1a;动手学深度学习~现代循环神经网络 a a a a a a a a a a a a

动态页面调研及设计方案

文章目录 vue2 动态表单、动态页面调研一、form-generator二、ng-form-element三、Variant Form四、form-create vue2 动态表单、动态页面调研 一、form-generator 预览&#xff1a;https://mrhj.gitee.io/form-generator/#/ Vue2 Element UI支持拖拽生成表单不支持其他组件…

(六)、基于 LangChain 实现大模型应用程序开发 | 基于知识库的个性化问答 (文档分割 Splitting)

在上一章中&#xff0c;我们刚刚讨论了如何将文档加载到标准格式中&#xff0c;现在我们要谈论如何将它们分割成较小的块。这听起来可能很简单&#xff0c;但其中有很多微妙之处会对后续工作产生重要影响。 文章目录 1、为什么要做文档分割&#xff1f;2、文档分割方式3、基于…

手机app、pc客户端(芯象推送到wvp视频平台)

手机app&#xff08;芯象推送到wvp视频平台&#xff09; 下载安装 进入苹果应用商店&#xff0c;搜索芯象&#xff0c;点击下载&#xff0c;下载成功之后点击打开 注册账号进行登录&#xff0c;下图是主界面&#xff0c;点击开始直播进入直播配置界面 推流直播 选择本地推流&a…

IDEA调用接口超时,但Postman可成功调用接口

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

SpringCloud微服务通信两种方式Feign和Dubbo:Feign基本使用、自定义配置、使用优化;Dubbo基本实现

RestTemplate存在的问题 代码可读性差&#xff0c;编程体验不统一参数复杂&#xff0c;URL难以维护 Feign远程调用 Feign简介 ​ Feign是SpringCloud提供的一个声明式的伪Http客户端&#xff0c;它使得调用远程服务就像调用本地服务一样简单&#xff0c;只需要创建一个接口…

【广州华锐互动】VR虚拟现实技术助力太空探险:穿越时空,探索宇宙奥秘

随着科技的不断发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术已经逐渐走进我们的生活。在教育领域&#xff0c;VR技术的应用也日益广泛&#xff0c;为学生提供了更加生动、直观的学习体验。本文将以利用VR开展太空探险学习为主题&#xff0c;探讨如何将这一先进技术…

【数据库】你听说过矢量数据库吗?

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️其他领域】 文章目录 前言什么是向量/矢量数据库嵌入模型使用向量数据库的优势与传统数据库的对比其他方面 AWS 如何支持您的矢量数据库需求&#xff1f;Amazon OpenSearch ServiceAmazon Aurora Pos…

毕业设计JSP 2384网上diy蛋糕店管理系统【程序源码+讲解视频+调试运行】

一、摘要 本文将介绍一个功能全面、易于使用的网上DIY蛋糕店管理系统。该系统包括用户和管理员两种用户&#xff0c;每种用户都有相应的功能模块。系统实现了网站首页、用户注册/登录、蛋糕展示、综合排行、购物车、蛋糕DIY和用户中心等功能&#xff0c;同时管理员还可以进行管…

Java —— 抽象类和接口

目录 1. 抽象类 1.1 抽象类概念 1.2 抽象类语法与特性 1.3 抽象类的作用 2. 接口 2.1 接口的概念 2.2 接口的语法规则与特性 2.3 实现多个接口(解决多继承的问题) 2.4 接口间的继承 2.5 抽象类和接口的区别 2.6 接口的使用实例 2.7 Clonable 接口和深拷贝 2.7.1 Cloneable接口 …

【前端学java】java中的Object类(8)

往期回顾&#xff1a; 【前端学java】JAVA开发的依赖安装与环境配置 &#xff08;0&#xff09;【前端学 java】java的基础语法&#xff08;1&#xff09;【前端学java】JAVA中的packge与import&#xff08;2&#xff09;【前端学java】面向对象编程基础-类的使用 &#xff08…