当前位置: 首页 > news >正文

LeetCode:977. 有序数组的平方 双指针 时间复杂度O(n)

977. 有序数组的平方

题目链接

题目描述

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

示例 1:

输入: [-4,-1,0,3,10]
输出: [0,1,9,16,100]

示例 2:

输入: [-7,-3,2,3,11]
输出: [4,9,9,49,121]

提示:

  • 1 <= nums.length <= 10^4
  • -10^4 <= nums[i] <= 10^4
  • nums 已按非递减顺序排序。

进阶:请你设计时间复杂度为 O(n) 的算法解决此问题。

题解

解法一:暴力法

暴力法的思路是遍历数组,将每个元素平方后放入新数组,然后排序。时间复杂度为 O(nlogn)
这个解法我们不再赘述。

解法二:双指针法

双指针法的思路是维护两个指针,一个指向数组的左端,一个指向数组的右端。

  • 首先,使用leftright指针分别指向数组的最左端和最右端。
  • 然后,比较left指针指向的元素和right指针指向的元素的平方,将较大的平方放入新数组的末尾,并将left指针右移,或者将right指针左移。
  • 这样每次选择出的,都是当前数组中,平方值最大的元素。
  • 重复上述步骤,直到选出len(nums)个元素。

复杂度分析:

  • 指针移动的次数为 O ( n ) O(n) O(n),每个指针移动的时间复杂度为 O ( 1 ) O(1) O(1),所以总时间复杂度为 O ( n ) O(n) O(n)
  • 空间复杂度为 O ( n ) O(n) O(n),新数组的大小为 n

代码实现

Python版本:

class Solution(object):def sortedSquares(self, nums):""":type nums: List[int]:rtype: List[int]"""right=len(nums)-1left=0res=[0]*len(nums)for i in range(right,-1,-1) :if abs(nums[right])<abs(nums[left]):res[i]=nums[left]*nums[left]left+=1else:res[i]=nums[right]*nums[right]right-=1return res

C++版本:

class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {int right=nums.size()-1;int left=0;vector<int> res(right+1,0);for(int i=right;i>=0;i--){if (abs(nums[left]) >= abs(nums[right])){res[i]=nums[left]*nums[left];left++;}else{res[i]=nums[right]*nums[right];right--;}}return res;}
};

Go版本:

func sortedSquares(nums []int) []int {n := len(nums)i, j, k := 0, n-1, n-1ans := make([]int, n)for i <= j {lm, rm := nums[i]*nums[i], nums[j]*nums[j]if lm > rm {ans[k] = lmi++} else {ans[k] = rmj--}k--}return ans
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 利用数据分析提升SEO排名的7种方法
  • C++ vectorOJ练习题
  • 【C/C++】“秒懂”学C/C++不可错过的“经典编程题” — 日期类的经典运用 (含题链接)
  • Git-下载的zip包项目重新指向github项目地址
  • Request Response
  • VSCode学习笔记
  • 802.11 中 scrambler的matlab仿真
  • 云计算之大数据(下)
  • 陕西农信银行合规知识竞赛活动方案
  • STM32 HAL freertos零基础(一)-任务创建
  • 算法-双指针技巧
  • 搭建Kafka+zookeeper集群调度
  • 运营如何判断账号是否起号失败?
  • Bev pool 加速(1): torch.autograd.Function的使用
  • 从C到C++
  • eclipse的离线汉化
  • Netty源码解析1-Buffer
  • Object.assign方法不能实现深复制
  • PHP 的 SAPI 是个什么东西
  • Python3爬取英雄联盟英雄皮肤大图
  • ReactNative开发常用的三方模块
  • 当SetTimeout遇到了字符串
  • 基于HAProxy的高性能缓存服务器nuster
  • 简析gRPC client 连接管理
  • 利用jquery编写加法运算验证码
  • 前端_面试
  • 区块链技术特点之去中心化特性
  • 实习面试笔记
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (+4)2.2UML建模图
  • (02)vite环境变量配置
  • (06)Hive——正则表达式
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (8)STL算法之替换
  • (Oracle)SQL优化技巧(一):分页查询
  • (编译到47%失败)to be deleted
  • (多级缓存)多级缓存
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)IOS中获取各种文件的目录路径的方法
  • (转)Mysql的优化设置
  • **CI中自动类加载的用法总结
  • .“空心村”成因分析及解决对策122344
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .Net Core 中间件与过滤器
  • .Net CoreRabbitMQ消息存储可靠机制
  • .NET 使用配置文件
  • .NET编程——利用C#调用海康机器人工业相机SDK实现回调取图与软触发取图【含免费源码】