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

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)-1
        left=0
        res=[0]*len(nums)
        for i in range(right,-1,-1) :
            if abs(nums[right])<abs(nums[left]):
                res[i]=nums[left]*nums[left]
                left+=1
            else:
                res[i]=nums[right]*nums[right]
                right-=1
        return 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-1
	ans := make([]int, n)
	for i <= j {
		lm, rm := nums[i]*nums[i], nums[j]*nums[j]
		if lm > rm {
			ans[k] = lm
			i++
		} else {
			ans[k] = rm
			j--
		}
		k--
	}
	return ans
}

http://www.kler.cn/a/300332.html

相关文章:

  • C++ 类与对象(上)
  • Docker 实现MySQL 主从复制
  • elasticsearch 数据导出/导入
  • JavaScript语言的软件工程
  • 深度学习在语音识别中的应用
  • 低代码系统-产品架构案例介绍(五)
  • MySQL原理之UUID主键分析,插入或更新语法分析
  • 人工智能--网络可解释性框架
  • AI大模型日报#0908:OpenAI计划年底推出GPT Next、Roblox官宣AI秒生3D物体模型
  • AI电商,如何提高设计效率?
  • qt下两种方式读取opencv 图片各个通道的值
  • YOLOv8改进 | 模块缝合 | C2f 融合RVB + EMA注意力机制【二次融合 + 结构图】
  • 论文阅读:3D Gaussian Splatting for Real-Time Radiance Field Rendering
  • 【Unity】HybridCLR测试笔记
  • 数据结构代码集训day16(适合考研、自学、期末和专升本)
  • ASP.NET Core 入门教学二十三 模型绑定和验证
  • 高并发内存池项目(3)——项目框架介绍与实现线程池
  • 【2024】Benchmarking Foundation Models with Language-Model-as-an-Examiner
  • 【佳学基因检测】在织梦网站中, 创建或修改目录:/var/www/html/cp 失败! DedeTag Engine Create File False
  • Adobe After Effects下载_AE绿色中文版下载,AE2023软件下...
  • JavaScript 中的 `var`, `let`, `const` 详解
  • --数据库--
  • Kubernetes中Pod和Node标签的添加、修改与删除
  • 如何用python打开csv文件路径
  • Jenkins 构建后操作(Send build artifacts over SSH)
  • 入侵检测与防御系统:网络安全的前沿阵地