【算法】数组|有序数组的平方

数组:存放在连续内存空间上的相同类型数据的集合

  • 下标从0开始
  • 内存地址是连续的

一.有序数组的平方

LeetCode题目链接977. 有序数组的平方

暴力排序

  • 思路:先将数组的每个元素求平方,然后在排序得到结果
  • 代码实现
public int[] sortedSquares(int[] nums) {
  for (int i = 0; i < nums.length; i++) {
    nums[i] *= nums[i];
  }
  Arrays.sort(nums);
  return nums;
}
  • 时间复杂度:O(nlogn)

双指针法

  • 思路:数组为非递减顺序的,上面的暴力排序并未用到此特性,肯定不是最优解。那么我们来思考下,该题求每个元素平方的有序数组,非递减顺序的数组有三种可能:全为正数(平方排序相同)、全为负数(平方排序为逆序)、有正有负(??),而平方的大小是与绝对值正相关的,可以把数组想象成一个数轴,距离0的位置越远则绝对值越大则平方越大,我们就可以利用这个特性,设置两个指针分别指向数组的两头,然后进行比较把最大的放到新数组的最后一位,然后将指针向左或右移动,再进行比较后把第二大的放到新数组的倒数第二位置。
  • 代码实现
public int[] sortedSquares(int[] nums) {
  int left = 0, index = nums.length -1, right = nums.length - 1;
  int[] newNums = new int[nums.length];
  while(left <= right) {
    if (nums[left] * nums[left] <= nums[right] * nums[right]) {
      newNums[index] = nums[right] * nums[right];
      right--;
    } else {
      newNums[index] = nums[left] * nums[left];
      left++;
    }
    index--;
  }
  return newNums;
}
  • 时间复杂度:O(n)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值