力扣----有序数组的平方(Java实现)

力扣----有序数组的平方(Java实现):
题目:给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
此题要注意的一个点是,负数平方后变成了正数;

方法一:先把数组中的每个数都平方后,再对其进行排序;这种方法容易想但耗时长
此处用的是冒泡排序:(这里可以用别的排序方法,也可以用java自带的排序方法Arrys.sort())
原理:第一个数和第二个数比较,如果第一个数大于第二个,那么两个数交换后;接着第二个数和第三数比较,如果第二个大于第三个数
那么两个数交换后;如此两两比较下去,直到数组末尾,这样为一趟排序。一趟排序后可以确定的是最后一个数一定是最大的数,
所以在第二趟排序时,最后一个数就不需要参与,也就是说需要排序的数组长度缩短了。
外层for循环i初始值为数组长度,每次递减 1,用来控制排序的趟数和需要排序的数组长度;
内层for循环用来进行数组间元素的两两比较,j 不能大于i,因为i控制着需要排序的数组长度,j每次递增 1

class Solution {
    public int[] sortedSquares(int[] A) {
        for (int i = 0; i < A.length; i++) {
            A[i] = A[i]*A[i];
        }
        bubbleSort(A);
        return A;
    }

    public void bubbleSort(int[] arr){
       for (int i = arr.length; i >= 0; i--) {
            for (int j = 1; j < i; j++) {
                if (arr[j-1] > arr[j]){
                    exchange(arr,j-1,j);
                }
            }
        }
    }

    public int[] exchange(int[] arr,int i,int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
        return arr;
    }
}

在这里插入图片描述

方法二:双指针法;耗时短
因为输入的数组是并不是无序的,除去其中的重复数字,输入的数组其实是一个递增数组;那么我们只需要准备两个指针分别
指向数组的最左和最右,再准备一个数组result存放最后的结果;result数组结果是从后往前放的,所以再用一个指针i 一开始指向
result数组最右边
如果左指针所指元素绝对值 > 右指针所指元素绝对值,那么让左指针所指元素的平方放入result数组的最后,i指针向左移一位;
同时左指针向右移一位,接着比较;
如果左指针所指元素绝对值 < 右指针所指元素绝对值,那么让右指针所指元素平方放入result数组的最后,i指针向左移一位;
同时右指针向右移一位,接着比较。

class Solution {
    public int[] sortedSquares(int[] A) {
        int left = 0;
        int right = A.length-1;
        int[] result = new int[A.length];
        int i = A.length-1;
        while (i >= 0){
            if (Math.abs(A[left]) > Math.abs(A[right])){
                result[i--] = A[left] * A[left];
                left++;
            }else {
                result[i--] = A[right] * A[right];
                right--;
            }
        }
        return result;
    }

}

在这里插入图片描述

方法一是自己想的,确实很好想出来,方法二是看了大佬的题解

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值