[LeetCode]day4 977.有序数组的平方

devtools/2025/2/3 12:31:58/

977. 有序数组的平方 - 力扣(LeetCode)

一.题目

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

    二.题解 

    解法一:傻瓜式直接排序

    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;}
    };

    思路非常简单 就是把数组内每个元素平方之后 调用库函数直接进行排序

    时间复杂度比较高,为nlogn

    解法二:双指针更复杂解法

    class Solution {
    public:vector<int> sortedSquares(vector<int>& nums) {vector<int> ans;int q = -1;  // 初始q指向ans数组的“尾”for (int i = 0; i < nums.size(); i++) {ans.push_back(nums[i] * nums[i]);  // 将平方值加入ansq++;  // 增加“尾指针”// 如果新添加的元素小于之前的元素,说明需要重新插入排序int temp = ans[q];  // 保存当前插入的平方值int p = q - 1;  // 用p寻找插入位置// 向前遍历查找插入位置while (p >= 0 && ans[p] > temp) {ans[p + 1] = ans[p];  // 右移元素p--;}// 插入当前的平方值ans[p + 1] = temp;}return ans;}
    };

    时间复杂度为O(N^2)

    这个的思路是将数组从头到尾遍历一遍 每遍历一个元素就加入结果数组中去,将新加入的元素与原来元素的最后一个元素进行对比,如果比它小,则需要重新排序;

    解法三:双指针两面夹击法

    我们注意观察数组的特征,会存在负数! 类似-5,-3,1,2,3  从数组的两端向内延伸,数的绝对值逐渐减小 所以两端的数据绝对值是最大的。用两个指针从数组的一头一尾向中间进行遍历,每次去比较两端数据谁的平方更大,将更大的逆序放入结果数组中

    class Solution {
    public:vector<int> sortedSquares(vector<int>& nums) {vector<int>ans(nums.size()); //注意给数组预留空间int k= nums.size()-1; for(int i=0,j=nums.size()-1;i<=j;){if(nums[i]*nums[i]>nums[j]*nums[j]){ans[k--]=nums[i]*nums[i];i++;}else{ans[k--]=nums[j]*nums[j];j--;}}return ans;}
    };
    

    易错点在于需要逆序将数据存放进目标数组中!


    http://www.ppmy.cn/devtools/155716.html

    相关文章

    【工欲善其事】利用 DeepSeek 实现复杂 Git 操作:从原项目剥离出子版本树并同步到新的代码库中

    文章目录 利用 DeepSeek 实现复杂 Git 操作1 背景介绍2 需求描述3 思路分析4 实现过程4.1 第一次需求确认4.2 第二次需求确认4.3 第三次需求确认4.4 V3 模型&#xff1a;中间结果的处理4.5 方案验证&#xff0c;首战告捷 5 总结复盘 利用 DeepSeek 实现复杂 Git 操作 1 背景介绍…

    Windows socket之WSAEventSelect模型_wsaeventselect模型的socket编程和客户端应用的功能

    WSAEVENT hEvent,LPWSANETWORKEVENTS lpNetworkEvents);该函数可以查找发生在套接字上的网络事件&#xff0c;并清除系统内部的网络事件记录&#xff0c;重置事件对象。s为发生网络事件的套接字句柄。hEvent为被重置的事件对象句柄&#xff08;可选)。lpNetworkEvents为指向WSA…

    【回溯+剪枝】回溯算法的概念 全排列问题

    文章目录 46. 全排列Ⅰ. 什么是回溯算法❓❓❓Ⅱ. 回溯算法的应用1、组合问题2、排列问题3、子集问题 Ⅲ. 解题思路&#xff1a;回溯 剪枝 46. 全排列 46. 全排列 ​ 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 …

    LeetCode 344: 反转字符串

    LeetCode 344: 反转字符串 - C语言题解 这道题的目标是反转一个字符数组&#xff08;字符串&#xff09;。我们将通过双指针法来实现这一功能。 代码实现 #include <stdio.h>void reverseString(char* s, int sSize) {int left 0, right sSize - 1; // 定义左右指针…

    一元函数微积分的几何应用:二维平面光滑曲线的曲率公式

    文章目录 前言曲率和曲率半径的定义曲率计算公式参数方程形式直角坐标显式方程形式极坐标形式向量形式 前言 本文将介绍二维平面光滑曲线的曲率定义以及不同形式的曲率及曲率半径公式的推导。 曲率和曲率半径的定义 &#xff08;关于二维平面光滑曲线的定义以及弧长公式请参…

    使用 Tauri 2 + Next.js 开发跨平台桌面应用实践:Singbox GUI 实践

    Singbox GUI 实践 最近用 Tauri Next.js 做了个项目 - Singbox GUI&#xff0c;是个给 sing-box 用的图形界面工具。支持 Windows、Linux 和 macOS。作为第一次接触这两个框架的新手&#xff0c;感觉收获还蛮多的&#xff0c;今天来分享下开发过程中的一些经验~ 为啥要做这个…

    流媒体娱乐服务平台在AWS上使用Presto作为大数据的交互式查询引擎的具体流程和代码

    一家流媒体娱乐服务平台拥有庞大的用户群体和海量的数据。为了高效处理和分析这些数据&#xff0c;它选择了Presto作为其在AWS EMR上的大数据查询引擎。在AWS EMR上使用Presto取得了显著的成果和收获。这些成果不仅提升了数据查询效率&#xff0c;降低了运维成本&#xff0c;还…

    【自学笔记】Java的重点知识点-持续更新

    提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Java知识点概览一、Java简介二、Java基本语法三、面向对象编程&#xff08;OOP&#xff09;四、异常处理五、常用类库六、多线程编程七、网络编程 注意事项 总结 Ja…