首页 > 其他分享 >977有序数组的平方

977有序数组的平方

时间:2023-04-20 20:44:10浏览次数:37  
标签:977 平方 right nums int result 数组 size left

力扣刷题 977.有序数组的平方--day2

题目分析

这道题目, 乍一看就是一个排序问题嘛,大不了计算完平方后, 再用个插入排序或者冒泡排序罢了

但是, 题目告诉我们, 这个数组原来就是有序的, 所以我们要用好
这个特点, 从而简化代码

数组在平方后, 后面那些原来为正数的顺序并没有改变, 前面的负数改变了

我的第一想法是: 将前面负数平方后的值插入后面的正数平方中, 但是如果在原来的数组上面去插入的话,涉及到数组元素的移动,事倍功半, 所以, 可以新建一个数组 result。

解法一

本质上也是双指针, 只不过每次都选出最小的那个值, 类似于选择排序

vector<int> sortedSquares(vector<int>& nums) {
    int size = nums.size();
    vector<int> result;
    //找到正负数的分界点
    int keyIndex = 0;
    while(keyIndex < size&&nums[keyIndex] < 0){
        keyIndex++;
    }
    //左右两个指针分别向左向右前进
    int left = keyIndex - 1;
    int right = keyIndex;

    while(left >= 0 && right <= size - 1){
        //选择较小值
        if(-1 * nums[left] > nums[right]){
            result.push_back(nums[right] * nums[right]);
            right++;
        }
        else{
            result.push_back(nums[left] * nums[left]);
            left--;
        }
    }

    //左侧率先完成
    if(left < 0){
        while (right <= size - 1)
        {
            result.push_back(nums[right] * nums[right]);
            right++;
        }
    }
    //右侧率先完成
    else if(right > size - 1){
        while(left >=0){
            result.push_back(nums[left] * nums[left]);
            left--;
        }
    }
    return result;
}

解法二

这个解法的重点是发现:最大值出现在最两侧

同样利用双指针, 一左一右, 每次选出最大的那个值, 有点类似于冒泡排序

vector<int> sortedSquares(vector<int>& nums) {
    int size = nums.size();
    vector<int> result(size);
    int newIndex = size - 1;
    int left = 0, right = size - 1;

    while(left <= right){
        if(abs(nums[left]) > abs(nums[right])){
            result[newIndex] = (nums[left] * nums[left]);
            newIndex--;
            left++;
        }
        else{
            result[newIndex] = (nums[right] * nums[right]);
            newIndex--;
            right--;
        }
    }
    return result;
}

标签:977,平方,right,nums,int,result,数组,size,left
From: https://www.cnblogs.com/jianchuxin/p/17338257.html

相关文章

  • C#基础 Math Pow Sqrt 幂与平方根
     .NETFramework:4.7.2       IDE:VisualStudioCommunity2019        OS:Windows10x64    typesetting:Markdown codeusingSystem;namespaceConsoleApp{classProgram{staticvoidMain(string[]args){......
  • 数组的初始化问题
    数组两种有初始化方式:静态初始化和动态初始化:静态初始化int[]arr=newint[]{1,2,3,4,5};静态初始化时内容已经确定,长度根据内容推断出来。动态初始化int[]arr=newint[3];arr[0]=1;arr[1]=2;arr[3]=3;动态初始化时仅指定长度,内容后续指定。{1,2,3}和new......
  • Net7中对数组全部加1操作
    1注意foreach不能⽤var,也不能直接⽤int,需要refint,注意arr要转换为Span。23int[]arr={1,2,3,4,5};45Console.WriteLine(string.Join(",",arr));//1,2,3,4,567foreach(refintvinarr.AsSpan())//net7特性,可以使用foreach对元素进......
  • Vue3 watch 监听对象数组中对象的特定属性
    Vue3watch监听对象数组中对象的特定属性在Vue3中,可以使用watch函数来监听对象数组中对象的特定属性。可以通过在回调函数中遍历数组来检查对象的特定属性是否发生变化,并在变化发生时执行相应的操作。一、监听对象的特定属性例如,假设有一个名为items的对象数组,其中每个......
  • int数组转化为List
    评:今天想把int数组转换为List,知道在Arrays里有一个静态的方法asList();所以就用了:int[]data=newint[]{1,2,3};ListdataList=Arrays.asList(data);结果运行起来得不到想要的结果,后来看了一下,是因为没有得到想要的List。自己试了试。把int改为Integer就行了:Inte......
  • 二分查找:剑指 Offer 11. 旋转数组的最小数字
    题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2]为[1,2,3,4,5]的一次旋转,该数组的最......
  • #yyds干货盘点# LeetCode面试题:搜索旋转排序数组 II
    1.简述:已知存在一个按非降序排列的整数数组nums,数组中的值不必互不相同。在传递给函数之前,nums在预先未知的某个下标k(0<=k<nums.length)上进行了旋转,使数组变为[nums[k],nums[k+1],...,nums[n-1],nums[0],nums[1],...,nums[k-1]](下标从0开始计数)。例如,[0,1,2......
  • 动态规划05——1043. 分隔数组以得到最大和
    1043.分隔数组以得到最大和给你一个整数数组arr,请你将该数组分隔为长度最多为k的一些(连续)子数组。分隔完成后,每个子数组的中的所有值都会变为该子数组中的最大值。返回将数组分隔变换后能够得到的元素最大和。本题所用到的测试用例会确保答案是一个32位整数。示例1......
  • 力扣题解分享1043.分割数组以得到最大和
    1043.分隔数组以得到最大和题目描述给定一个整数数组arr和一个整数k,将该数组分隔为长度最多为k的一些连续子数组。分隔完成后,每个子数组中的所有值都会变为该子数组中的最大值。返回将数组分隔变换后能够得到的元素最大和。示例input:arr=[1,15,7,9,2,5,10]k=......
  • java数组
    一维数组的定义、使用Java中的数组是类类型。 类型 [数组名[]|[]数组名]  [= [{值1[,值n]*}|new类型[元素数量]]  ]?;  其中,类型没有任何限制,可以是基本类型也可以是类、接口类型。用new创建数组时,系统会自动初始化数组中的所有元素:数组类型赋值0,布......