Bootstrap

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

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

  • 下标从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)
;