【每日一题】有序数组的平方

🌟个人博客:www.hellocode.top🌟
⭐所有文章均在上方博客首发,其他平台同步更新
🔥本文专栏:《每日一题》
⚡如有问题,欢迎指正,一起学习~~
文章部分参考《代码随想录》,如有侵权,请联系删除~~


  • 时间:2022-05-10

  • 题目序号:977

  • 难度:简单

问题描述

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

来源:力扣(LeetCode)

示例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 已按 非递减顺序 排序

解题思路

题解部分参考自代码随想录。如有侵权,请联系进行删除~~

  • 在解题时,我们都可以先思考暴力解法进行解题,然后再通过逐步优化,来提高代码的性能
  • 对于本题,可以通过暴力和双指针两种方法进行解决

暴力解法

  • 根据本题的题目描述,暴力解法其实很容易就能想到
  • 直接通过for循环遍历数组,让nums[i] *= nums[i]即可
  • 在遍历结束后,数组内的值就已经是平方后的值了,只不过不是按顺序排列,使用Arrays里的sort方法进行排序即可(快排)

双指针解法

img

  • 原数组中的元素其实是有序的,主要是进行平方后数组中数据的排序
  • 不难想到,平方后,最大的值一定是最左边或者最右边的值,不可能是中间的元素
  • 因此,可以定义两个指针,一个指向数组首元素,一个指向数组尾元素
  • 根据上图中的if条件进行判断循环,最终即可获得有序的平方值

代码实现

通过上述分析,分别可以通过暴力解法和双指针解法两种方式来实现移除元素

暴力解法

class Solution {
    public int[] sortedSquares(int[] nums) {
		for(int i = 0; i < nums.length; i++){
            nums[i] *= nums[i];
        }
        Arrays.sort(nums);
        return nums;
    }
}

  • 时间复杂度:O(nlogn)

双指针解法

class Solution {
    public int[] sortedSquares(int[] nums) {
        int size = nums.length;
        int[] result = new int[size];
        int left = 0;
        int right = size - 1;
        int index = size - 1;
        while(left <= right){
            if(nums[left] * nums[left] < nums[right] * nums[right]){
                result[index--] = nums[right] * nums[right];
                right--;
            }else{
                result[index--] = nums[left] * nums[left];
                left++;
            }
        }
        return result;
    }
}

  • 时间复杂度:O(n)

总结

  • 一般遇到一个问题时,可以先考虑暴力解法,然后再考虑其他更加高效的算法或者对暴力解法进行不断优化,来提高算法的效率
  • 数组操作中的很多地方都会用到双指针解法,所以对于双指针一定要掌握并能够灵活的运用
  • 在有索引的地方,对于临界值的判断一定要准确,什么时候<=,什么时候<,要能够分清
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九思のJava之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值