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


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

相关文章
|
1月前
leetCode(删除有序数组中的重复项)
如何在不使用额外空间的情况下,通过双指针法原地删除有序数组中的重复项。
33 2
|
3月前
|
存储 Java API
LeetCode------合并两个有序数组(4)【数组】
这篇文章介绍了LeetCode上的"合并两个有序数组"问题,并提供了三种解法:第一种是使用Java的Arrays.sort()方法直接对合并后的数组进行排序;第二种是使用辅助数组和双指针技术进行合并;第三种则是从后向前的双指针方法,避免了使用额外的辅助数组。
LeetCode------合并两个有序数组(4)【数组】
|
1月前
【LeetCode 48】108.将有序数组转换为二叉搜索树
【LeetCode 48】108.将有序数组转换为二叉搜索树
38 0
|
3月前
|
算法
LeetCode第26题删除有序数组中的重复项
这篇文章介绍了LeetCode第26题"删除有序数组中的重复项"的解题方法,通过使用双指针技巧,高效地去除数组中的相邻重复元素。
LeetCode第26题删除有序数组中的重复项
|
3月前
|
算法
LeetCode第80题删除有序数组中的重复项 II
文章介绍了LeetCode第80题"删除有序数组中的重复项 II"的解法,利用双指针技术在O(1)空间复杂度内原地删除重复元素,并总结了双指针技术在处理有序数组问题中的应用。
LeetCode第80题删除有序数组中的重复项 II
|
3月前
|
Python
【Leetcode刷题Python】977. 有序数组的平方
解决LeetCode "有序数组的平方" 问题的方法:使用Python内置的快速排序、直接插入排序(但会超时)和双指针技术,并给出了每种方法的Python实现代码。
21 1
【Leetcode刷题Python】977. 有序数组的平方
|
3月前
|
算法
LeetCode第88题合并两个有序数组
文章分享了LeetCode第88题"合并两个有序数组"的解法,通过从后向前的合并策略避免了数组元素的前移,使用三个指针高效地完成了合并过程。
|
3月前
|
Python
【Leetcode刷题Python】108. 将有序数组转换为二叉搜索树
LeetCode上108号问题"将有序数组转换为二叉搜索树"的Python实现,通过递归选取数组中间值作为根节点,构建高度平衡的二叉搜索树。
25 2
|
3月前
|
算法 Java
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
54 0
|
3月前
|
Python
【Leetcode刷题Python】26. 删除有序数组中的重复项
本文提供了一种使用快慢指针法在原地删除升序数组中重复元素的Python实现,返回删除后数组的新长度,同时保持元素的相对顺序。
43 0