leetcode刷题记录之977

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;
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值