刷题LeetCode:977.有序数组的平方

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/squares-of-a-sorted-array/

题目描述

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

题目分析

本题提供2种方法:

  • 先平方,再排序(最常想到的方法)
  • 双指针:两个指针分别指向位置 0 和 n−1,每次比较两个指针对应的数,选择较大的那个逆序放入答案并移动指针

代码实现

public class YouXuShuZuPingFang_977 {

    public static void main(String[] args) {
        YouXuShuZuPingFang_977 youXuShuZuPingFang_977 = new YouXuShuZuPingFang_977();
        int[] nums = {-7,-3,2,3,11};
        youXuShuZuPingFang_977.sortedSquares1(nums);
        youXuShuZuPingFang_977.sortedSquares2(nums);
    }


   
    /**
     * 方法2:双指针
     * 两个指针分别指向位置 0 和 n−1,每次比较两个指针对应的数,选择较大的那个逆序放入答案并移动指针
     * 

* 时间复杂度:O(n),其中 n 是数组 nums 的长度。 *

* 空间复杂度:O(1)。除了存储答案的数组以外,我们只需要维护常量空间。 * * @param nums * @return */ public int[] sortedSquares2(int[] nums) { int length = nums.length; int[] ans = new int[length]; // ans 的下标 int index = length - 1; for (int i = 0, j = length - 1; i <= j; ) { int pfi = nums[i] * nums[i]; int pfj = nums[j] * nums[j]; if (pfi > pfj) { ans[index] = pfi; I++; } else { ans[index] = pfj; j--; } index--; } System.out.println("方法2:双指针,指向位置 0 和 n−1"); for (int num : ans) { System.out.println(num); } return ans; } /** * 方法1:先平方,再排序 *

* 时间复杂度:O(nlogn),其中 n 是数组 nums 的长度。 *

* 空间复杂度:O(logn)。除了存储答案的数组以外,我们需要 O(logn) 的栈空间进行排序。 * * @param nums * @return */ public int[] sortedSquares1(int[] nums) { int[] ans = new int[nums.length]; for (int i = 0; i < nums.length; i++) { ans[i] = nums[i] * nums[i]; } Arrays.sort(ans); System.out.println("方法1:先平方,再排序"); for (int num : ans) { System.out.println(num); } return ans; } }

运行结果:


方法一复杂度(先平方再排序)

  • 时间复杂度:O(nlogn),其中 n 是数组 nums 的长度。
  • 空间复杂度:O(logn)。除了存储答案的数组以外,我们需要 O(logn) 的栈空间进行排序。

方法二复杂度(双指针)

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)。除了存储答案的数组以外,只需要维护常量空间。

好了,今天就到这里,感谢各位看官到这里,不如点个关注吧!

你可能感兴趣的:(刷题LeetCode:977.有序数组的平方)