LeetCode:977. 有序数组的平方

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

🍎道阻且长,行则将至。🍓


🌻算法,不如说它是一种思考方式🍀


算法专栏: 👉🏻123


一、🌱977. 有序数组的平方

  • 题目描述:给你一个按==非递减顺序==排序的整数数组 nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
  • 来源:力扣(LeetCode)
  • 难度:简单
  • 提示:

1 <= nums.length <= 104
-104 <= nums[i] <= 104
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]

*进阶
请你设计==时间复杂度为 O(n) 的算法==解决本问题

🌴解题

1.直接排序

最简单的想法:直接对数组平方后排序,而排序算法中的快速排序时间复杂度达到O(nlogn)。

2.双指针

这个问题只是由于前面部分的负数影响我们的结果,在负数那一块在前面的更大,所以可以在前后双指针往中间遍历,(先找大的)对比平方值从后往前存入结果中,就可以完成。

image.png

code:

class Solution {
    public int[] sortedSquares(int[] nums) {
                int i=0;
        int end =nums.length;
        int[] ans=new int[end];

        end--;
        int k=end;
        while(i <= end) {
            if(nums[i]*nums[i]<nums[end]*nums[end]){
                ans[k]=nums[end]*nums[end];
                end--;k--;
            }
            else{
                ans[k]=nums[i]*nums[i];
                i++;k--;
            }

        }
        return ans;

    }
}

image.png

那么我们也可以从中间开始,先找到最小的:

code:

class Solution {
public int[] sortedSquares(int[] nums) {
        int n=nums.length;
        int[] ans=new int[n];
        if(nums[0]>=0){
            insert(nums,ans,0);
        }else{
            for (int i = 0; i < n; i++) {//找到第一个非负数
                if(nums[i]>=0){
                    insert(nums,ans,i);
                    break;
                }
                else if(i==n-1){//都是负数
                    insert(nums,ans,i+1);
                    break;
                }

            }

        }
        return ans;
    }

    private static void insert(int[] nums, int[] ans, int i) {
        int j=i-1;
        int k=0;
        while (j >=0&&i<nums.length) {
            if(j<0)break;
            //前面的小
            if(-nums[j]<nums[i]){
                ans[k]=nums[j]*nums[j];
                j--;k++;
            }else{
                ans[k]=nums[i]*nums[i];
                i++;k++;
            }
        }
        while(j>=0) {
            ans[k]=nums[j]*nums[j];
            j--;k++;
        }
        while(i<nums.length) {
            ans[k]=nums[i]*nums[i];
            i++;k++;
        }
    }
}

image.png


☕物有本末,事有终始,知所先后。🍭

相关文章
|
2月前
|
算法
LeetCode刷题---167. 两数之和 II - 输入有序数组(双指针-对撞指针)
LeetCode刷题---167. 两数之和 II - 输入有序数组(双指针-对撞指针)
|
2月前
|
存储
【合并两个有序数组】LeetCode第88题讲解
【合并两个有序数组】LeetCode第88题讲解
|
4天前
leetcode代码记录(有序数组的平方
leetcode代码记录(有序数组的平方
7 0
|
4天前
leetcode代码记录(有序数组两数之和
leetcode代码记录(有序数组两数之和
11 0
|
27天前
【力扣】80.删除有序数组中的重复项Ⅱ
【力扣】80.删除有序数组中的重复项Ⅱ
|
1月前
|
存储
【力扣经典面试题】80. 删除有序数组中的重复项 II
【力扣经典面试题】80. 删除有序数组中的重复项 II
|
1月前
|
存储
【力扣经典面试题】合并两个有序数组
【力扣经典面试题】合并两个有序数组
|
1月前
|
存储 C语言
【C语言】Leetcode 88.合并两个有序数组
【C语言】Leetcode 88.合并两个有序数组
16 3
|
2月前
LeetCode刷题---80. 删除有序数组中的重复项 II(双指针)
LeetCode刷题---80. 删除有序数组中的重复项 II(双指针)
|
2月前
LeetCode刷题---26. 删除有序数组中的重复项(双指针)
LeetCode刷题---26. 删除有序数组中的重复项(双指针)