977号题目
对C++比较熟悉,java疫情期间线上学的,本来就学的不咋地,现在还都忘光了,已经在重新学了,初期代码可能有点异味
1.暴力法,先相反数,再排序,最后平方
2.相向双指针法,时间复杂度已经成为O(n)了
选择大的那个数放到数组的后面,一个一个放
//暴力法
class Solution {
public int[] sortedSquares(int[] nums) {
int i, j,temp;
for(i = 0; i < nums.length; i++){ //将数全变为非负数
if(nums[i] < 0){
nums[i] = -nums[i];
}
}
for(i = 0; i < nums.length-1; i++){//为了回想一下基础,这里本人专门采用冒泡排序
for(j = 0; j < nums.length - i -1; j++){
if(nums[j] > nums[j + 1]){
temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
}
}
}
for(i = 0; i < nums.length; i++){//平方
nums[i] = nums[i] * nums[i];
}
return nums;
}
};
//相向双指针法
class Solution {
public int[] sortedSquares(int[] nums) {
int first = 0, last = nums.length - 1;//分别指向头尾
int[] num = new int[nums.length];//定义新数组
int k = nums.length - 1;//新数组的下标
while(first <= last){//注意等于,不写的话会少i=j时的这一个元素
if(nums[first] * nums[first] < nums[last] * nums[last]){
num[k--] = nums[last] * nums[last];
last--;
}
else{
num[k--] = nums[first] * nums[first];
first++;
}
}
return num;
}
}