有序数组的平方

 

文章目录

  • 题目描述
  • 一,解法一
  • 二,解法二
  • 总结

 


题目描述

给你一个按 非递减顺序 排序的整数数组 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(nlogn),这种办法方案比较容易想到,但是其时间复杂度比较高。

代码实现:

 public static int[] sortedSquares(int[] nums){
        for (int i=0;i<nums.length;++i){   //先将每个位置的元素进行平方
            nums[i]=nums[i]*nums[i];
        }
        Arrays.sort(nums);               //利用排序算法进行排序
        return nums;
    }
 

二,解法二

算法思想:在一个给定的排序好的数组中,如果该数组全部是正数,那么平方后的相对位置还是不变的,如果该数组全部是负数,那么平方后的排序是逆序的,所以说导致该排序好的数组平方后位置变换的原因就是负数,因为越小的负数,其平方后越大,比如-7的平方要大于-4的平方,而正数越大,其平方后的结果也就越大 ,我们可以用两个指针,一个指针指向开始的位置,另一个指针指向数组结束位置,因为如果存在负数,都在数组的开始位置,申请一个与原来数组一样大的新数组,比较两个指针指向元素的平方后的大小关系,哪个更大就将哪个放到新数组的最后位置,然后新数组向前挪动一个位置,一直到两个指针越过对方结束。这样的话其时间复杂度就会降到O(n),大大减少了运营的时间复杂度。

代码实现:

public static int[] sortedSquares(int[] nums) {
        int []result=new int[nums.length];   //申请一个和原来数组一样大的新数组
        int i=0,j=nums.length-1,k=nums.length-1; i指针指向原来数组的开始位置,j指针指向原来数组的结束位置,k指针指向新数组的结束位置
        while(i<=j){    //当i<=j 的时候     //当i,j两个指针还没有相互跨越的时候
          if(nums[i]*nums[i]>nums[j]*nums[j]){   //如果i指针指向的元素平方后比j的大
              result[k--]=nums[i]*nums[i];       //将i指针的元素平方后放到k指定位置上面  k--
              i++;
          }else{
              result[k--]=nums[j]*nums[j];    //将j指针的元素平方后放到k指定位置上面,k--
              j--;
          }
        }
        return result;
    }

 


总结

碰都数组问题,可以考虑申请一个新的数组,完成一系列操作。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值