977. 有序數組的平方https://leetcode.cn/problems/squares-of-a-sorted-array/
1.題目
給你一個按 非遞減順序 排序的整數數組 nums
,返回 每個數字的平方 組成的新數組,要求也按 非遞減順序 排序。
示例 1:
輸入:nums = [-4,-1,0,3,10] 輸出:[0,1,9,16,100] 解釋:平方后,數組變為 [16,1,0,9,100] 排序后,數組變為 [0,1,9,16,100]
示例 2:
輸入:nums = [-7,-3,2,3,11] 輸出:[4,9,9,49,121]
提示:
1 <= nums.length <= 104
-104 <= nums[i] <= 104
nums
已按 非遞減順序 排序
進階:
- 請你設計時間復雜度為
O(n)
的算法解決本問題
2.題解
題解1:
先把所有的元素平方,然后再使用選擇排序算法進行排序(用其他排序算法也可以)。
class Solution {public int[] sortedSquares(int[] nums) {int i,j,min,temp;//1、把所有的元素平方for(i=0; i<nums.length; i++) {nums[i] = nums[i] * nums[i];}//選擇排序算法,使元素從小到大排序for(i=0;i<nums.length-1;i++){min=i; // 記錄最小值的位置,第一個元素默認最小for(j=i+1;j<nums.length;j++)if(nums[j]<nums[min]) // 找到目前最小值min=j; // 記錄最小值的位置if(min!=i) { // 交換兩個變量temp=nums[min];nums[min]=nums[i];nums[i]=temp;}}return nums; }
}
注:選擇排序(Selection sort)是一種簡單直觀的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再從剩余未排序元素中繼續尋找最小(大)元素,然后放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。
題解2:
使用Arrays.sort()函數。
class Solution {public int[] sortedSquares(int[] nums) {for(int i=0; i<nums.length; i++) {nums[i] = nums[i] * nums[i];}Arrays.sort(nums);return nums; }
}
題解3:
使用雙指針。
class Solution {public int[] sortedSquares(int[] nums) {// 創建一個與輸入數組相同長度的數組來存儲結果int[] result = new int[nums.length];// 初始化變量 i 為數組的起始位置,j 為數組的結束位置,k 為結果數組的最后一個位置int i, j, k = nums.length - 1;// 使用雙指針法進行比較,i 從數組開頭,j 從數組結尾,k 從結果數組的末尾開始填充for(i = 0, j = nums.length - 1; i <= j; ) {// 比較當前 i 和 j 位置的平方值,較大的平方值放到 result[k] 中if(nums[i] * nums[i] > nums[j] * nums[j]) {// 將 i 位置的平方放入 result[k] 中result[k] = nums[i] * nums[i];// k 遞減,準備填充下一個最大值k--;// i 向右移動,繼續向右處理i++;} else {// 將 j 位置的平方放入 result[k] 中result[k] = nums[j] * nums[j];// k 遞減,準備填充下一個最大值k--;// j 向左移動,繼續向左處理j--;}}// 返回結果數組,它已經按升序排列了return result;}
}