首页 > 其他分享 >【代码随想录】一、数组:3.双指针 - 977.有序数组的平方

【代码随想录】一、数组:3.双指针 - 977.有序数组的平方

时间:2024-08-14 15:17:44浏览次数:13  
标签:977 平方 nums 随想录 数组 ans 指针

本文为 977.有序数组的平方 的解法,部分图文参考自代码随想录977.有序数组的平方

1.题目1:977. 有序数组的平方

1.1.解法1:直接排序

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        for (int i = 0; i < nums.size(); i++) {
            nums[i] = nums[i] * nums[i];
        }
        sort(nums.begin(), nums.end());
        return nums;
    }
};

● 时间复杂度:\(O(nlogn)\)
● 空间复杂度:\(O(logn)\)

1.2.解法2:双指针法

1.题目分析
题目所给定的数组为非递减顺序排序的整数数组,例如:[-4, -1, 0, 3, 10]。
该数组各元素平方后为:[16, 1, 0, 9, 100],原数组能够划分为两部分:负数 - 0和正数,左侧平方后单调递减,右侧平方后仍单调递增。
2.双指针
定义一个新数组ans,和nums数组一样的大小,让k指向ans数组终止位置。
设置双指针i、j分别指向数组首和尾,皆向内依次进行对比:
nums[i] * nums[i] < nums[j] * nums[j],ans[k] = nums[j] * nums[j],j--;
nums[i] * nums[i] >= nums[j] * nums[j],ans[k] = nums[i] * nums[i],i++;
ans[k]取两个指针所指向的元素中 更大的元素,随后移动到前一个位置(k--),再次进行以上对比。

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int n = nums.size();
        vector<int>ans(n, 0);
        int i = 0, j = n - 1, k = n - 1;
        while (i <= j) { // 注意这里要i <= j,因为最后要处理两个元素
            if (nums[i] * nums[i] < nums[j] * nums[j]) {
                ans[k--] = nums[j] * nums[j];
                j--;
            }
            else {
                ans[k--] = nums[i] * nums[i];
                i++;
            }
        }
        return ans;
    }
};

● 时间复杂度:\(O(n)\)
● 空间复杂度:\(O(1)\)

标签:977,平方,nums,随想录,数组,ans,指针
From: https://www.cnblogs.com/Henfiu/p/18359046

相关文章

  • 【代码随想录】一、数组:2.移除元素
    部分图文参考于:代码随想录-移除元素和力扣官方解法。1.题目1★:27.移除元素1.1.解法1:暴力解法考验对数组底层实现的理解:数组的元素是不能删的,只能覆盖。通过两层for循环来求解,外层for循环遍历数组元素,内层for循环将目标值进行覆盖。classSolution{public:intremove......
  • 【代码随想录】一、数组:1.二分查找
    部分图文参考于:代码随想录-二分查找,本文仅作为个人学习使用,如有侵权,请联系删除。1.概念二分查找也称折半查找(BinarySearch),是一种在有序数组中查找某一特定元素的搜索算法。我们可以从定义可知,运用二分搜索的前提是数组必须是有序的,这里需要注意的是,我们的输入不一定是数组,也......
  • 【代码随想录】一、数组:理论基础
    原文链接:代码随想录-数组理论基础,本文仅作为个人学习使用,如有侵权,请联系删除。数组是非常基础的数据结构,在面试中,考察数组的题目一般在思维上都不难,主要是考察对代码的掌控能力。数组是存放在连续内存空间上的相同类型数据的集合。数组可以方便的通过下标索引的方式获取到下......
  • c语言转换char字符数组为大写小写
    #include<string.h>#include<stdlib.h>#include<stdio.h>#include<time.h>#include<ctype.h>#include<sys/stat.h>voidgetdate(char*datestr,char*format){ time_tnnowtime=time(NULL); structtm*ptmTemp=loc......
  • 代码随想录训练营day20|235. 二叉搜索树的最近公共祖先,701.二叉搜索树中的插入操作,450
    二叉搜索树的最近公共祖先题目根据二叉搜索树的特性,它的公共祖先肯定是值夹在p和q之间的(满足此条件的第一个点)TreeNode*getroot(TreeNode*root,TreeNode*p,TreeNode*q){ if(rooot==NULL)returnNULL; if(root->val<p->val&&root->val<q->val){ returngetroot(r......
  • 代码随想录day29 || 134 加油站,135 分糖果,860 柠檬水找零,406 根据身高重建队列
    加油站funccanCompleteCircuit(gas[]int,cost[]int)int{ //思路,首先统计一个差值数组,表示行驶到下一个加油站可以补充的油量,然后加总差值数组, //如果小于0,表示从起始位置到目前为止剩余油量小于0,不足以跑完全程,同时将起始位置放到遍历的下一个位置 iflen(gas)==0......
  • 2024-08-14:用go语言,给定两个长度分别为n和m的整数数组nums和changeIndices,下标从1开始
    2024-08-14:用go语言,给定两个长度分别为n和m的整数数组nums和changeIndices,下标从1开始。初始时,nums中所有下标均未标记。从第1秒到第m秒,每秒可以选择以下四种操作之一:1.选择范围[1,n]中一个下标i,将nums[i]减少1。2.将nums[changeIndices[s]]设为任意非负整数。3.选择范围......
  • 从字符串里面解析数组
    需求,从一个字符串里面,解析出一个数组。例如:“1,2,3,4,5”,"1-5","1,2,4","5-10,12,13"能正常解析出一个数组出来。字符串里面,支持“,”,"-"2种用法。 #include<iostream>#include<string>#include<vector>#include<sstream>#......
  • 3152. 特殊数组 II
    3152.特殊数组II题目链接:3152.特殊数组II代码如下:classSolution{public:vector<bool>isArraySpecial(vector<int>&nums,vector<vector<int>>&queries){vector<int>d(nums.size());//std::iota(numbers.......
  • DHU OJ 二维数组 n 层正方形
     思路及代码//n个数s=2n-1/*1111112221123211222111111*///num1row(1,1)->(1,5),(5,1)->(5,5);column(1,1)->(5,1),(1,5)->(5,5)//num2row(2,2)->(2,4),(4.2)->(4,4);column(2,2)->(4,2),(2,4)->(4,4)//num3row(3,3)-......