开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 6 天,点击查看活动详情
977.有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。
示例 1: 输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100],排序后,数组变为 [0,1,9,16,100]
示例 2: 输入:nums = [-7,-3,2,3,11] 输出:[4,9,9,49,121]
暴力解法
首先是我自己做的最低级的暴力解法
先将数组中所有元素都变为原本的平方,然后用了冒泡排序,后面发现暴力解法也大有讲究,这个时间复杂度是O(n2)。
sort函数
然后呢这里可以用快排,直接省去好多代码量。并且可以降低时间复杂度为O(nlogn)。java里的sort函数与c++里的sort函数的使用方法有些不同,java中sort函数的格式:
sort函数的基本格式(默认排序为升序排序)
Arrays.sort(数组名,起始下标,终止下标);
需要注意的是,这里起始下标和终止下标必须是整数,不能是浮点数,不然会报错。
如果一个数组初始化时已经赋值了,那么sort函数就可以有另外一种格式
Arrays.sort(数组名);
根据这个,上边我们冒泡排序那一大段代码就可以改成sort函数的形式了,也就是下面这样
Arrays.sort(nums,0,nums.length);
或者
Arrays.sort(nums);
一行就可以搞定了
cmp函数使用方法
cmp函数格式:
int compare(Object o1, Object o2);
这里传入函数的是java中的类,注意,java中无结构体。此时sort函数格式为
Arrays.sort(数组名, 起始下标, 终止下标, new cmp());
基本方法
int compare(Object o1, Object o2) 返回一个基本类型的整型
升序排序,
则o1 小于o2,返回-1(负数),相等返回0,01大于02返回1(正数)
降序排序
则o1 小于o2,返回1(正数),相等返回0,01大于02返回-1(负数)
具体写法
class cmp implements Comparator<Object> {
public int compare(Object A, Object B) ///降序排序
{
if(A.x<B.x)
{
return 1;
}
else if(A.x==B.x)
{
return 0;
}
else
{
return -1;
}
}
}
main函数
Arrays.sort(num, 0, n, new cmp());
双指针
class Solution {
public int[] sortedSquares(int[] nums) {
int[] res=new int[nums.length];
int k=nums.length-1;
int j=nums.length-1;
int i=0;
while(i<=j){
if(nums[i]*nums[i]>=nums[j]*nums[j]){
res[k--]=nums[i]*nums[i];
i++;
}else{
res[k--]=nums[j]*nums[j];
j--;
}
}
return res;
}
}
这种方法时间复杂度为O(n)。设置两个指针,一个从最左边开始,一个从最右边开始,比较左右指针指向的元素平方的大小,将较大的那个放入新数组的最后,由此依此类推。思路还是很简单滴。
最后附上做题时发现的一种很秀的操作