力扣----有序数组的平方(Java实现):
题目:给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
此题要注意的一个点是,负数平方后变成了正数;
方法一:先把数组中的每个数都平方后,再对其进行排序;这种方法容易想但耗时长
此处用的是冒泡排序:(这里可以用别的排序方法,也可以用java自带的排序方法Arrys.sort())
原理:第一个数和第二个数比较,如果第一个数大于第二个,那么两个数交换后;接着第二个数和第三数比较,如果第二个大于第三个数
那么两个数交换后;如此两两比较下去,直到数组末尾,这样为一趟排序。一趟排序后可以确定的是最后一个数一定是最大的数,
所以在第二趟排序时,最后一个数就不需要参与,也就是说需要排序的数组长度缩短了。
外层for循环i初始值为数组长度,每次递减 1,用来控制排序的趟数和需要排序的数组长度;
内层for循环用来进行数组间元素的两两比较,j 不能大于i,因为i控制着需要排序的数组长度,j每次递增 1
class Solution {
public int[] sortedSquares(int[] A) {
for (int i = 0; i < A.length; i++) {
A[i] = A[i]*A[i];
}
bubbleSort(A);
return A;
}
public void bubbleSort(int[] arr){
for (int i = arr.length; i >= 0; i--) {
for (int j = 1; j < i; j++) {
if (arr[j-1] > arr[j]){
exchange(arr,j-1,j);
}
}
}
}
public int[] exchange(int[] arr,int i,int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
return arr;
}
}
方法二:双指针法;耗时短
因为输入的数组是并不是无序的,除去其中的重复数字,输入的数组其实是一个递增数组;那么我们只需要准备两个指针分别
指向数组的最左和最右,再准备一个数组result存放最后的结果;result数组结果是从后往前放的,所以再用一个指针i 一开始指向
result数组最右边
如果左指针所指元素绝对值 > 右指针所指元素绝对值,那么让左指针所指元素的平方放入result数组的最后,i指针向左移一位;
同时左指针向右移一位,接着比较;
如果左指针所指元素绝对值 < 右指针所指元素绝对值,那么让右指针所指元素平方放入result数组的最后,i指针向左移一位;
同时右指针向右移一位,接着比较。
class Solution {
public int[] sortedSquares(int[] A) {
int left = 0;
int right = A.length-1;
int[] result = new int[A.length];
int i = A.length-1;
while (i >= 0){
if (Math.abs(A[left]) > Math.abs(A[right])){
result[i--] = A[left] * A[left];
left++;
}else {
result[i--] = A[right] * A[right];
right--;
}
}
return result;
}
}
方法一是自己想的,确实很好想出来,方法二是看了大佬的题解