题目 :给你一个按非递减顺序排序的整数数组nums 返回每个数字的平方组成的新数组,要求也按非递减顺序排序
非递减顺序:就是递增顺序 其数字可以有重复
非递增顺序:就是递减顺序 其数字可以有重复
思路:题目已经给暗示非递减顺序 (隐含已经排好顺序了) 最大的数字出现只能是两侧的值
碰见这种情况,我们用双指针解答 left指向下表0,right指向下标n-1
- 新建一个数组res用于存放新结果 site指向数组末尾,数组从后向前存储
- 如果 nums[left] * nums[left] > nums[right] * nums[right] res[site]= nums[left] * nums[left]
- 如果 nums[left] * nums[left] <= nums[right] * nums[right] res[site]= nums[right] * nums[right]
方法一:
代码如下:
时间复杂度(O(n))
public class test1 {
public int[] sortedSquares(int[] nums) {
int right = nums.length - 1;
int left = 0;
int[] res = new int[nums.length];
int index = res.length - 1;
while (left <= right) {
if (nums[left] * nums[left] > nums[right] * nums[right]) {
res[index--] = nums[left] * nums[left];
++left;
} else {
res[index--] = nums[right] * nums[right];
--right;
}
}
return res;
}
}
方法二:
- 向把数组中每个元素变成自身的平方
- 在进行排序(排序中最小的时间复杂度为nlogn)
代码如下:
时间复杂度(n+nlogn)
class Test {
public int[] sortedSquares(int[] nums) {
for (int i=0;i< nums.length;i++){
nums[i]=nums[i]*nums[i];
}
for (int i=0;i<nums.length-1;i++){
for (int j=0;j< nums.length-1;j++){
if(nums[j]>nums[j+1]){
int temp;
temp=nums[j];
nums[j]=nums[j+1];
nums[j+1]=temp;
}
}
}
return nums;
};
}