977.有序数组的平方

1.暴力排序
这道题最直观的方法在于,将数组中的每个数平方之后,排个序
    public int[] sortedSquares(int[] nums) {
       int[]ans = new int[nums.length];
       for(int i=0;i<nums.length;i++){
           ans[i] = nums[i]*nums[i];
       } 
       Arrays.sort(ans);
       return ans;
    }
 
2.双指针法
数组其实是有序的,只不过负数平方之后可能成为最大数了
那么数组平方的最大值其实就在数组的两端,不是最左边就是最右边,不可能是在中间。
此时可以考虑双指针法,i指向起始位置,j指向终止位置
定义一个新数组result,和A数组一样的大小
定义一个新指针k指向result数组终止位置
如果A[i]×A[i]<A[j]×A[j],那么就将A[j]放入result结果集的末尾,即k指针指向的数组索引位置,同时将k–
如图

    public int[] sortedSquares(int[] nums) {
        //双指针法
        //定义两个指针left和right,一个指向数组的起始位置,一个指向末尾
        int left = 0;
        int right = nums.length-1;
        //开辟一个结果集数组result
        int[]result = new int[nums.length];
        //定义指向result数组末尾的指针k
        int k = result.length-1;
        while(left<=right){
            if(nums[left]*nums[left]>nums[right]*nums[right]){
                //放入结果集
                result[k--] = nums[left]*nums[left];
                left++;
            }else{
                result[k--] = nums[right]*nums[right];
                right--;
            }
        }
        return result;
    }
                


















