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

作者:

乔希·布洛赫、尼尔·加夫特、约翰·罗斯

Arrays.sort

这个方法来自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–工作数组的可用大小
posted @ 2021-06-07 22:18  头上有多云  阅读(34)  评论(0)    收藏  举报