算法:有序数组的平方(Java版)(java 有序数组)

createh55个月前 (02-01)技术教程50

有序数组的平方

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

示例:

输入: nums = [-4,-1,0,3,10]
输出: [0,1,9,16,100]

暴力解法

Java代码

import java.util.Arrays;

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

时间复杂度

  • 时间复杂度:O(nlogn),其中 n 是数组的长度。这是因为 Arrays.sort() 方法通常使用一种基于归并排序或快速排序的算法,这两种算法的时间复杂度均为 O(nlogn)。

空间复杂度

  • 空间复杂度:O(1),除了输入数组和输出数组外,我们没有使用额外的空间。

双指针法

Java代码

public class Solution {
    public int[] sortedSquares(int[] nums) {
        int n = nums.length;
        int[] result = new int[n];
        
        int left = 0;
        int right = n - 1;
        int index = n - 1; // 从后往前填充结果数组
        
        while (left <= right) {
            int leftSquare = nums[left] * nums[left];
            int rightSquare = nums[right] * nums[right];
            
            if (leftSquare > rightSquare) {
                result[index] = leftSquare;
                left++;
            } else {
                result[index] = rightSquare;
                right--;
            }
            index--;
        }
        
        return result;
    }
}

时间复杂度

  • 时间复杂度:O(n),其中 n 是数组的长度。因为我们只遍历了一次数组。

空间复杂度

  • 空间复杂度:O(1),除了输入数组和输出数组外,我们没有使用额外的空间。

总结

暴力解法简单直观,但时间复杂度较高。双指针法则利用了题目中数组的有序性,以空间换时间,实现了更高效的解决方案。在处理这类问题时,优先考虑是否能利用数据的特性(如有序性)来优化算法。

相关文章

Java合并两个数组,以及数组排序并去重

还有其他的方法,这里我列出最简单的方法来实现。1、Java合并两个数组第一种:public static void main(String[] args) { int[] a = ne...

Java学习之数组——java基础篇(java数组知识)

如果希望保存一组有相同类型的数据,可以使用数组。数组的定义和内存分配Java 中定义数组的语法有两种: type arrayName[]; type[] arrayName;type 为Java中的任...

灵魂拷问:如何检查 Java 数组中是否包含某个值?

作者 | 沉默王二责编 | Elle在逛 programcreek 的时候,我发现了一些专注细节但价值连城的主题。比如说:如何检查Java数组中是否包含某个值 ?像这类灵魂拷问的主题,非常值得深入地研...

二十、Java数组(java数组的使用)

数组的基本概念数组是一种可以存储多个相同类型数据的数据结构,这些数据在内存中是连续存储的。数组中的每个数据项称为数组的元素,每个元素都可以通过索引来访问。Java中的数组属于对象类型,数组中的可以是基...

全新Java入门到架构师教程之Java15数组案例实现和Arrays

上篇文章写了《全新Java入门到架构师课程之Java15编程基础-数组(1):数组声明、初始化、数组元素的界限和遍历》,这次将接下去说java15编程之数组案例实现和Arrays一、数组基本练习//A...