977、有序数组的平方
给定一个按非递减顺序排序的整数数组 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 已按非递减顺序排序。
难度:简单 题目地址:https://leetcode-cn.com/problems/squares-of-a-sorted-array/
1、C语言代码:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* sortedSquares(int* A, int ASize, int* returnSize) {
int i = 0,j = ASize - 1;
int k = ASize - 1;
int *b = (int *)malloc(sizeof(int)*ASize);
while(i <= j){
if(abs(A[i]) > abs(A[j])){
b[k] = A[i] * A[i];
k--;
i++;
}
else{
b[k] = A[j] * A[j];
k--;
j--;
}
}
*returnSize = ASize;
return b;
}
解释: 方法:双指针。因为数组 A 已经排好序了, 所以可以说数组中的负数已经按照平方值降序排好了,数组中的非负数已经按照平方值升序排好了。举一个例子,若给定数组为 [-3, -2, -1, 4, 5, 6],数组中负数部分 [-3, -2, -1] 的平方为 [9, 4, 1],数组中非负部分 [4, 5, 6] 的平方为 [16, 25, 36]。我们的策略就是从前向后遍历数组中的非负数部分,并且反向遍历数组中的负数部分。我们可以使用两个指针分别读取数组的非负部分与负数部分 —— 指针 i 反向读取负数部分,指针 j 正向读取非负数部分。那么,现在我们就在使用两个指针分别读取两个递增的数组了(按元素的平方排序)。接下来,我们可以使用双指针的技巧合并这两个数组。
知识点回顾: 双指针技巧的使用。
2、Java代码:
class Solution {
public static int[] sortedSquares(int[] A) {
for(int i = 0; i < A.length; i++){
A[i] *= A[i];
}
Arrays.sort(A);
return A;
}
}
解释: 先计算数组A中各个数字的平方,再排序返回。
知识点回顾: 无。
3、Python代码:
class Solution:
def sortedSquares(self, A: List[int]) -> List[int]:
return sorted([i * i for i in A])
解释: 类似于Java的求解思路。
知识点回顾:
1、sorted() 函数对所有可迭代的对象进行排序操作。
sort 与 sorted 区别:
- sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
- list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。
语法:sorted(iterable, cmp=None, key=None, reverse=False)
iterable:可迭代对象。
cmp:比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
key:主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse:排序规则,reverse = True 降序 , reverse = False 升序(默认)。
返回值:返回重新排序的列表。
4、JavaScript代码:
/**
* @param {number[]} A
* @return {number[]}
*/
var sortedSquares = function(A) {
return A.map(item=>(Math.pow(item,2))).sort((a,b)=>a-b);
};
解释: 类似于Java的求解思路。
知识点回顾:
1、map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
map() 方法按照原始数组元素顺序依次处理元素。
注意: map() 不会对空数组进行检测。
注意: map() 不会改变原始数组。
语法:array.map(function(currentValue,index,arr), thisValue)
function(currentValue, index,arr):必须。函数,数组中的每个元素都会执行这个函数
currentValue:必须。当前元素的值。
index:可选。当前元素的索引值。
arr:可选。当前元素属于的数组对象。
thisValue:可选。对象作为该执行回调时使用,传递给函数,用作 “this” 的值。
如果省略了 thisValue,或者传入 null、undefined,那么回调函数的 this 为全局对象。
返回值:返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
2、sort() 方法用于对数组的元素进行排序。
语法:arrayObject.sort(sortby)
sortby:可选。规定排序顺序。必须是函数。
返回值:对数组的引用。请注意,数组在原数组上进行排序,不生成副本。
3、=>是es6语法中的arrow function
例如:
(x) => x + 6
等价于
function(x){
return x + 6;
};