LeetCode977 有序数组的平方

有序数组的平方
在这里插入图片描述

因为正负数的数组的平方可能相等,则若直接遍历数组可能造成的结果重复,因此可以采取使用set进行去重;也可以采用双指针的方法,先找到非负数的方法,定义left:为负数的最后一个元素,right:为正数的第一个元素,left指针不断向前移动,right指针不断向后移动,;进行比较判断即可

package KTwoPointers;

import sun.dc.pr.PRError;

import java.util.*;

/**
 * @Author Zhou  jian
 * @Date 2020 ${month}  2020/5/7 0007  11:28
 * 可以拆分为合并两个有序数组
 */
public class Problem977 {

    //使用List
    //创建一个新的数组,它的每个元素是给定数组对应位置元素的平方
    public int[] sortedSquares(int[] A) {

       List<Integer> rs = new ArrayList<>();

        for(int i=0;i<A.length;i++) {
            rs.add(A[i]*A[i]);
        }

        Collections.sort(rs);

        int[] rs1 = new int[rs.size()];

        for(int i=0;i<rs.size();i++){
            rs1[i]=rs.get(i);
        }

        return rs1;
    }


    /**
     * y因为数组A已经排好序了,所以可以说数组中的负数已经按照平方值降序排好了
     *                      数组中的非负数已经按照平方值升序排好了
     *算法:
     *          我们可以使用两个指针分别读取数组的非负部分与负数部分 —— 指针 i 反向读取负数部分,指针 j 正向读取非负数部分。

     那么,现在我们就在使用两个指针分别读取两个递增的数组了(按元素的平方排序)。接下来,我们可以使用双指针的技巧合并这两个数组。


     * @param A
     * @return
     */
    public int[] sortedSquares1(int[] A){

          int[] rs = new int[A.length];
          int index = 0;

          //数组中非负数最后一个(遍历过程中)
          int left = 0;
          //数组中整数
          int right=0;


          //数组中的第一个整数
          while(right<A.length&&A[right]<0)
              right++;
          left=right-1;

          while (left>=0&&right<A.length){
              if(A[left]*A[left]<A[right]*A[right]){
                  rs[index++]=A[left]*A[left];
                  left--;
              }else{
                  rs[index++]=A[right]*A[right];
                  right++;
              }

          }

          //左右子数组哪边还有剩余
        if(left>=0){

              while (left>=0){
                  rs[index++]=A[left]*A[left];
                  left--;
              }
        }

        if(right<A.length){
            while (right<A.length){
                rs[index++]=A[right]*A[right];
                right++;
            }
        }

        return rs;
    }



    public static void main(String[] args) {
//        PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();
//        priorityQueue.add(21);
//        priorityQueue.add(4);
//        priorityQueue.add(77);
//        priorityQueue.add(3);
//        priorityQueue.add(3);
//        priorityQueue.add(1);
//        System.out.println(priorityQueue);
    }



}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值