数组:存放在连续内存空间上的相同类型数据的集合
- 下标从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)