首页 > 编程语言 >算法第六天:力扣第977题有序数组的平方

算法第六天:力扣第977题有序数组的平方

时间:2024-06-15 11:58:40浏览次数:12  
标签:977 平方 right nums -- 力扣 第六天 result 数组

一、977.有序数组的平方的链接与题目描述

977. 有序数组的平方的链接如下所示:https://leetcode.cn/problems/squares-of-a-sorted-array/description/icon-default.png?t=N7T8https://leetcode.cn/problems/squares-of-a-sorted-array/description/

     给你一个按 非递减顺序 排序的整数数组 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) 的算法解决本问题

二、977.有序数组的平方的c++代码: 

   第一种方法:双指针的时间复杂度o(n),具体代码如下:

        vector<int> result(nums.size(), 0);
        int n=nums.size()-1;
        int left=0, right=n;
        while(left<=right){
            if(pow(nums[left], 2)>pow(nums[right], 2)){
                result[n--]=pow(nums[left], 2);
                left++;
            }
            else{
                result[n--]=pow(nums[right], 2);
                right--;
            }
        }
        return result;

    第二种方法:快速排序的时间复杂度o(nlogn) ,具体代码如下:

        for(int i=0;i<=nums.size()-1;i++){
            nums[i]*=nums[i]; //快速排序
        }
        sort(nums.begin(), nums.end());
        return nums;

三、解题思路

    本题主要讲解双指针的算法思路,下面的本题的4个步骤:

  1. 定义左指针的索引值为0,右指针为nums.size()-1,容器result装平方后的数组元素;
  2. 用while判断条件,如果左指针的值小于等于右指针的值,则循环继续,反之,则终止;
  3. 判断数组开始的值的平方是否大于末尾的值的平方,如果大于,输入result[n--]=pow(nums[left], 2); left++,反之,则result[n--]=pow(nums[right], 2); right--;
  4. 最后输出result,得出答案。

    感谢各位读者的阅读与支持,您的支持是我前进的动力!我希望我的博文能够带给您双指针的一些算法知识和启发。如果您有任何问题或意见,请随时联系我或在评论区评论。希望本题的算法知识对大家有帮助,谢谢各位读者的支持!!!

标签:977,平方,right,nums,--,力扣,第六天,result,数组
From: https://blog.csdn.net/m0_75068978/article/details/139549986

相关文章

  • 力扣刷题记录: 1339. 分裂二叉树的最大乘积
        本题是第174场周赛的Q3,LC竞赛分为1675.方法一.递归(超时)    单纯使用递归对每一个节点进行遍历,代码如下:classSolution{longlongans=-1;public:intmaxProduct(TreeNode*root){longlongtotal_sum=sum(root);......
  • 力扣刷题记录: 1424. 对角线遍历Ⅱ
        本题是第182场周赛的Q3,LC竞赛分为1780。方法一.利用反对角线性质    在同一条反对角线上的元素的i+j值是相同的,同时,根据遍历的方式可知,i值越大的元素在同一条反对角线之中越先被遍历,i+j值越小的反对角线越早被遍历。考虑采用有序的map对i+j......
  • 【动态规划】| 路径问题之不同路径II 力扣63
    ......
  • 力扣第198题“打家劫舍”
    关注微信公众号数据分析螺丝钉免费领取价值万元的python/java/商业分析/数据结构与算法学习资料在本篇文章中,我们将详细解读力扣第198题“打家劫舍”。通过学习本篇文章,读者将掌握如何使用动态规划来解决这一问题,并了解相关的复杂度分析和模拟面试问答。每种方法都将配以......
  • 【力扣真题】3.哈希表|算法真题程序设计数据结构考研保研复试机试面试秋招春招蓝桥杯
    242.有效的字母异位词给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。示例1:输入:s=“anagram”,t=“nagaram”输出:true示例2:输入:s=“rat”,t=“car”输出:false说明:你可以假设字符串只包含小写字母。力扣题目链接思......
  • 验证二叉搜索树-力扣
    第一次做这道题时,想的解法是递归去判断比较左节点小于中间节点,右节点大于中间节点,而这恰恰进入了陷阱,这道题不仅仅是判断子树是否左节点小于中间节点,右节点大于中间节点;要比较的是左子树所有节点小于中间节点,右子树所有节点大于中间节点。附上错误代码:classSolution{pu......
  • 力扣面试题 02.07. 链表相交
    一 题目:二思路:本题介绍两种思路解题,个人推荐思路一快速好理解 思路一: 1.先把其中一个链表的值变成负数 2.遍历另一个链表第一个出现负数的值就是交点 3.还原被改的链表 思路二:1.先用第一个链表的头节点head1搜索指针q遍历第一个链表直到为空,再把q放到head2......
  • 代码随想录算法训练营第第35天 | 977.有序数组的平方1005.K次取反后最大化的数组和 、
    1005.K次取反后最大化的数组和本题简单一些,估计大家不用想着贪心,用自己直觉也会有思路。https://programmercarl.com/1005.K次取反后最大化的数组和.html自己写的时间复杂度太高,看答案优化/***@param{number[]}nums*@param{number}k*@return{number}*/varl......
  • 路径总和-力扣
    本题想到的解法是对二叉树进行深度搜索,并记录路径和,当节点为叶子节点时,将路径和与目标值进行判断,如果相等则返回true,否则返回false,最后返回左右子树或的值即可,因为只需有一条满足条件就可以。/***Definitionforabinarytreenode.*structTreeNode{*intv......
  • 左叶子之和-力扣
    本题计算二叉树的左叶子之和,使用后序遍历的顺序对二叉树进行深度搜索,关键点在于,对左叶子节点的值的操作上,需要在左叶子节点的父节点进行。/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right......