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);
    }



}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章