給定一個按非遞減順序排序的整數陣列 A,返回每個數字的平方組成的新陣列,要求也按非遞減順序排序。

少歌發表於2020-11-03

題目

給定一個按非遞減順序排序的整數陣列 A,返回每個數字的平方組成的新陣列,要求也按非遞減順序排序。

示例 1:

輸入:[-4,-1,0,3,10]
輸出:[0,1,9,16,100]
示例 2:

輸入:[-7,-3,2,3,11]
輸出:[4,9,9,49,121]

提示:

1 <= A.length <= 10000
-10000 <= A[i] <= 10000
A 已按非遞減順序排序。

思路

情況①


陣列裡的元素都是非負數。

這種情況就比較好解決了,直接按順序把每個元素平方輸出就行。

情況②


陣列裡的元素都是非正數。

這種情況也比較好解決,直接按逆序把每個元素平方輸出就行。

情況③


陣列裡有正數也有負數。

這種情況就比較複雜了。

首先,原陣列有序,要得結果也是有序的,但原陣列裡的元素有正有負,而結果要的順序是 元素平方之後的順序,也就是原陣列元素絕對值的順序。

思維發散
看成左右兩個陣列:
在這裡插入圖片描述

把前後兩個陣列都進行 “平方” 處理
問題轉換
把問題轉換成:兩個有序陣列拼接成一個有序陣列

這樣我們就利用上了原陣列有序的條件,儘量利用我們有的條件,才能達到最優解。

程式碼

public void fun(int[] num){
        if (num.length == 1){//只有一個元素的話,直接平方輸出
            System.out.print("[ ");
            System.out.print(num[0]*num[0]);
            System.out.print("]");
            return;
        }
        if (num[0]<0){//如果第一個數小於零
            int zero = -1;
            for (int i = 0;i < num.length;i++){
                if (num[i] > 0){
                    //尋找第一個大於 0 的元素
                    zero = i;
                    break;
                }
            }
            if (zero == -1){//說明沒有大於0的元素(全是負數)
                //直接逆序輸出
                System.out.print ("[ ");
                for (int i = num.length-1;i>=0;i--){
                    System.out.print(num[i]*num[i]+" ");
                }
                System.out.print ("]");
                return;
            }
            //生成 結果陣列
            List<Integer> list = new ArrayList<>();
            int left = zero-1;
            int right = zero;

            int count = num.length;
            while (count>0) {
                if ((num[left] * num[left]) > (num[right] * num[right])) {
                    list.add(num[right] * num[right]);
                    if (right<(num.length-1)){
                        right++;
                    }
                    count--;
                    if (count == 1) {
                        list.add(num[left] * num[left]);
                        count--;
                    }
                } else {
                    list.add(num[left] * num[left]);
                    if (left>0){
                        left--;
                    }
                    count--;
                    if (count == 1) {
                        list.add(num[right] * num[right]);
                        count--;
                    }
                }
            }
            System.out.print ("[ ");
            for (int a:list){
                System.out.print(a+" ");
            }
            System.out.print ("]");
        }else {//說明第一個數也不小於零(全是正數)
            //直接平方輸出
            System.out.print ("[ ");
            for (int a:num){
                System.out.print(a*a+" ");
            }
            System.out.print ("]");
        }
    }

測試:

	int[] arr = {-4,-2,0,1,3};
    fun(arr);

結果:

[ 0 1 4 9 16 ]

That’s all,Thank you!!!

相關文章