leetcode977-有序数组的平方
https://leetcode-cn.com/problems/squares-of-a-sorted-array/
class Solution {
public int[] sortedSquares(int[] nums) {
/* //暴力解法
// 第一步:求出每一个位置上的数字的平方,替换掉原来的数字
// 第二步:从新排序
for (int i = 0; i < nums.length; i++) {
nums[i] = nums[i]*nums[i];
}
Arrays.sort(nums);
return nums;
*/
// O(n)
// o(n)就只能一边循环搞定了
// 那怎么搞呢?
// 看题目中给出的nums是已经排好序的了,那么我们假设某个位置是正负数的分界点
// 分界点左边的数都是负的,分界点右边的数都是正的
// 我们申请一个同样大小的数组用来存放答案,空间复杂度是O(1),result[]
// 然后开始从原始数组的左右两边开始遍历:
// 第一个数和最后一个数的平方比较,把大的那个放在result[]的最后一个位置上
// 然后小的那个数字的指针不动,大数的那个指针往里移动一个,再进行比较
// 直到两个指针相遇了,就结束
int position = nums.length-1;
int[] result = new int[nums.length];
int left=0;
int right = position;
while (left<=right){
if (nums[left]*nums[left]<nums[right]*nums[right]){
result[position--] = nums[right]*nums[right];
right--;
}else {
result[position--] = nums[left]*nums[left];
left++;
}
}
return result;
}
}
小拓展
第一种方法中的Arrays.sort();很有必要再来学习一下。
手头应该有一本JDK.chm的api帮助文件。
Arrays这个类包含用于操作数组的各种方法(例如排序和搜索)。这个类还包含一个静态工厂,它允许数组作为列表查看。
如果指定的数组引用为null(除非另有说明),则此类中的方法都会引发NullPointerException。
此类中包含的方法的文档包括实现的简要描述。此类描述应被视为实现注释,而不是规范的一部分。只要遵循规范本身,实现者应该可以随意替换其他算法(例如,sort(Object[])使用的算法不必是MergeSort,但必须是稳定的。)
此类是Java集合框架的成员。
自:
1.2
作者:
乔希·布洛赫、尼尔·加夫特、约翰·罗斯

这个方法来自java.util.Arrays;
可以看到:有18种变形,sort()发生了多态。但是我们可以找到规律:
int,float,long,short,double,char,byte,object类型的排序(8个)
再加8个sort([]A,int a,int b),表示从把数组A的[a.b]位置进行排序。
另外两个:
根据指定比较器产生的顺序对指定的对象数组进行排序。
public static <T> void sort(T[] a, Comparator<? super T> c)
根据指定比较器产生的顺序对指定对象数组的指定范围进行排序。
public static <T> void sort(T[] a, int fromIndex, int toIndex, Comparator<? super T> c)
将指定的数组按数字升序排序。
public static void sort(int[] a) {
DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);//不用掌握,看看就好,大神们的排序
}
}
这里又调用了另一个函数。DualPivotQuicksort
这个类实现了Vladimir Yaroslavskiy、Jon Bentley和Josh Bloch提出的双轴快速排序算法。
如果可能的话,使用给定的工作区数组切片对数组的指定范围进行排序以进行合并
DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
参数:
a–要排序的数组
left–要排序的第一个元素(包括)的索引
right–要排序的最后一个元素(包括)的索引
工作–工作区数组(切片)
workBase–工作数组中可用空间的来源
workLen–工作数组的可用大小

浙公网安备 33010602011771号