CS-Wiki CS-Wiki
Home
知识体系总览
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • MySQL
  • Redis
  • 设计模式
  • Java 基础
  • Java 集合
  • Java 并发
  • Java 虚拟机
  • Spring
  • Kafka
  • 校招扫盲
  • 项目推荐
  • 唠唠嗑儿
  • 读书笔记
归档
GitHub (opens new window)
Home
知识体系总览
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • MySQL
  • Redis
  • 设计模式
  • Java 基础
  • Java 集合
  • Java 并发
  • Java 虚拟机
  • Spring
  • Kafka
  • 校招扫盲
  • 项目推荐
  • 唠唠嗑儿
  • 读书笔记
归档
GitHub (opens new window)
  • 刷题模板汇总
  • 一些刷题小技巧
  • 整数 and 位运算

  • 数组

  • 链表

  • 哈希表

  • 字符串

  • 栈

  • 队列

  • 二叉树

  • 前缀树

  • 二分查找

  • 双指针法

    • 双指针法理论基础
    • 左右指针

      • 验证回文串
      • 最多删除一个字符得到回文
      • 回文子字符串的个数
      • 反转字符串
      • 反转字符串II
      • 两数之和 II - 输入有序数组
      • 反转字符串中的单词 III
      • 翻转字符串里的单词
      • 剑指 Offer 58 - II. 左旋转字符串
      • 有序数组的平方
        • 📃 题目描述
        • 🔔 解题思路
        • 💥 复杂度分析
      • 三数之和
      • 四数之和
      • 删除排序链表中的重复元素
      • 删除排序链表中的重复元素 II
      • 删除有序数组中的重复项
      • 压缩字符串
      • 移除元素
      • 移动零
      • 调整数组顺序使奇数位于偶数前面
      • 最短无序连续子数组
      • 找到 K 个最接近的元素
      • 盛最多水的容器
    • 滑动窗口

    • 快慢指针

    • 其他

  • 区间求和问题

  • 排序

  • 回溯算法

  • 贪心算法

  • 动态规划

  • 图

  • 数学

  • 自动机

  • 海量数据和空间限制

  • 05-数据结构与算法
  • 双指针法
  • 左右指针
小牛肉
2021-10-04
目录

有序数组的平方

# 📃 题目描述

题目链接:977. 有序数组的平方 - 力扣(LeetCode) (leetcode-cn.com) (opens new window)

给你一个按 非递减顺序 排序的整数数组 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]

# 🔔 解题思路

最简单的办法,遍历数组挨个平方后做排序,遍历的时间复杂度是 O(N),排序的时间复杂度就是 O(LogN) ,即这种暴力法的时间复杂度是 O(LogN),空间复杂度是 O(1)

还有一种时间复杂度 O(N) ,空间复杂度 O(N) 的方法:

由于数组中存在负数,负数平方之后可能比正数的平方要大。但是,数组的排序是有序的,也就是说,数组平方的最大值一定在数组的两端,不是最左边就是最右边,不可能是中间。

考虑用左右指针。左指针指向第一个元素,右指针指向最后一个元素。

这样,我们可以保证,随着左右指针的不断往中间靠拢,它们代表的平方数也越来越小。所以,我们只需要新建一个数组 res 用来存储最终的结果集,每次将左右指针比较出来的较大的结果从数组末端插入数组即可:

  • 如果 nums[left]^2 > nums[right]^2 => nums[left]l^2 加入 res 结果集,并 left ++;
  • 如果 nums[right]^2 >= nums[left]^2 => nums[right]l^2 加入 res 结果集,并 right --;
class Solution {
    public int[] sortedSquares(int[] nums) {
        if (nums == null || nums.length == 0) {
            return nums;
        }

        int[] res = new int[nums.length];
        // res 数组的下标
        int index = nums.length - 1;

        int left = 0;
        int right = nums.length - 1;
        
        // 注意这里是 left <= right, 因为最后要处理最后一个元素
        while (left <= right) {
            if (nums[left] * nums[left] > nums[right] * nums[right]) {
                res[index --] = nums[left] * nums[left];
                left ++;
            } else {
                res[index --] = nums[right] * nums[right];
                right --;
            }
        }

        return res;
    }
}

# 💥 复杂度分析

  • 空间复杂度:O(N)
  • 时间复杂度:O(N)

🎁 公众号

各位小伙伴大家好呀,叫我小牛肉就行,目前在读东南大学硕士,上方扫码关注公众号「飞天小牛肉」,与你分享我的成长历程与技术感悟~

帮助小牛肉改善此页面 (opens new window)
Last Updated: 2023/02/16, 11:27:10
剑指 Offer 58 - II. 左旋转字符串
三数之和

← 剑指 Offer 58 - II. 左旋转字符串 三数之和→

最近更新
01
关于编程满天星
02
让我来告诉你 Java 程序员是怎么一步一步从入行到被裁的
06-08
03
Vision Pro,未来已来
06-06
更多文章>
Theme by Vdoing | Copyright © 2019-2023 飞天小牛肉 | 皖ICP备2022008966号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式