首页 > 其他分享 >【LeetCode数组#3有序数组的平方】有序数组平方

【LeetCode数组#3有序数组的平方】有序数组平方

时间:2022-12-30 19:55:25浏览次数:64  
标签:平方 数组 nums int length 有序 排序

有序数组的平方

力扣题目链接(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]

初见思路

由题意,我们需要做两件事情:

1、将所给数组内的元素取平方

2、给平方之后的元素按升序重新排序

两种思路

一种是所有元素取平方后用sort函数排序;

另一种思路,若源数组存在负数,那么其平方后的值肯定会变大,因此顺序也会变化

那么先把数组中的所有值取绝对值,然后排序,最后再将每个数取平方

用什么方法排序?冒泡?以下是暴力方法解

class Solution {
    public int[] sortedSquares(int[] nums) {
        int tmp = 0;
        for(int i = 0; i < nums.length - 1; i++){
            for(int j = 0; j < nums.length - 1 - i; j++){
                //先把负的元素取反,然后冒泡排序
                if(nums[i] < 0){
                    nums[i] = -nums[i];
                }
                if(nums[j] > nums[j + 1]){
                    tmp = nums[j];
                    nums[j] = nums[j + 1];
                    nums[j + 1] = tmp;
                } 
            }
        }
        //最后把数组内元素取平方
        for(int k = 0; k < nums.length; k++){
            nums[k] = nums[k]*nums[k];
        }
    return nums;
    }
}

可优化的点太多了,排序方法、取平方方法都可以改进

常规思路

这里仍可以用双指针的思想去做

首先这里有一个规律:在有序数组中,能够在平方之后出现的最大值的元素一定在数组的两端,不可能在数组中间

基于上述现象就可以使用双指针来解决问题

两个指针分别位于数组的两端,在遍历过程中不断向数组中心移动

img

此外,我们还需要额外定义一个指针用于表示新数组的下标

注意,题目没有要求原地操作,因此可以新建一个数组用于存放元素

因为我们需要从大到小排序,所以新数组指针的初值就设置为数组长度-1即可

解题模板

按照上面的思路写就行

Java版

class Solution {
    public int[] sortedSquares(int[] nums) {
        int[] newnums = new int[nums.length];
        int k = newnums.length -1;
        for(int i = 0, j = nums.length - 1; i <= j; ){//不要忘了=,要不然就会漏一个
            if(nums[i] * nums[i] > nums[j] * nums[j]){
                newnums[k--] = nums[i] * nums[i];//注意是后--
                //k -= 1;//要么就 这样写
                ++i;
            }else{//小于、等于的情况
                newnums[k--] = nums[j] * nums[j];
                --j;
            }
        }
        return newnums;
    }
}

Python版

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        n = len(nums)
        i,j,k = 0,n - 1,n - 1
        ans = [-1] * n
        while i <= j:
            lm = nums[i] ** 2
            rm = nums[j] ** 2
            if lm > rm:
                ans[k] = lm
                i += 1
            else:
                ans[k] = rm
                j -= 1
            k -= 1
        return ans

标签:平方,数组,nums,int,length,有序,排序
From: https://www.cnblogs.com/DAYceng/p/17015719.html

相关文章

  • 21. 合并两个有序链表
    背景这个题目一般用来学习数据结构时练手用。但我们今天只研究递归,按tag刷。题目链接:https://leetcode.cn/problems/merge-two-sorted-lists/description/递归解题一般......
  • 数组——多维数组、Arrays类讲解
    数组——多维数组、Arrays类讲解多维数组多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组。二维数组inta[][]=newi......
  • js获取数组最后一个元素的方法
    //定义一个数组letarr=[10,20,30,40]//不会修改到原数组arr.slice(-1)[0]//40=>arr.slice(-1)返回的是数组arr.at(-1)//40=>支持传入一个下标,支持负......
  • 第三章《数组与循环》第8节:数组与循环经典例题
    利用数组和循环可以解决很多经典问题,比如对数字的查找、排列、筛选等。本小节甄选了其中一些有代表性的问题集中进行讲解,认真学习这些经典例题不仅有助于巩固Java语言的相关......
  • 迭代(遍历数组)forEach
    1.forEach用法vararr=[13,2,2,5] varsum=0 //forEach用法:Array.forEach(function(数组当前项的值,数组当前项的索引值,数组本身){}) arr.forEach(function(valu......
  • 稀疏数组
    1.先看实际需求编写的五子棋程序中,在存盘退出和续上盘的功能分析问题:因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据,那么该怎么解决呢?稀疏数组。2.基......
  • 基于Python Numpy的数组array和矩阵matrix详解
    NumPy的主要对象是同种元素的多维数组。这是一个所有的元素都是一种类型、通过一个正整数元组索引的元素表格(通常是元素是数字)。在NumPy中维度(dimensions)叫做轴(axes)......
  • 把文件里的数据变成shell脚本中的数组
    阿斯蒂芬filelist=$(cat/opt/fossx/data/wyyshell/norma.txt)数组的定义格式是有强制规范的:(item item item ...),注意是两个空格;赋值号=两边不能有空格,必须紧挨......
  • 集合与数组的两个工具类Collections 和Arrays
    publicclassCollections01{//Arrays.deepEquals深入到堆空间比较各个值//*Arrays.asList快速生成一个集合@TestpublicvoidarraysTest(......
  • 代码随想录算法训练营Day2|977.有序数组的平方,209.长度最小的子数组,59.螺旋数组
    977.有序数组的平方题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/文章链接:https://programmercarl.com/0209.长度最小的子数组.html视频链接:https......