Leetcode刷题100天—977. 有序数组的平方(双指针)—day20

Posted 神的孩子都在歌唱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode刷题100天—977. 有序数组的平方(双指针)—day20相关的知识,希望对你有一定的参考价值。

前言:

作者:神的孩子在歌唱

大家好,我叫运智

977. 有序数组的平方

难度简单286收藏分享切换为英文接收动态反馈

给你一个按 非递减顺序 排序的整数数组 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]

提示:

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums 已按 非递减顺序 排序

进阶:

  • 请你设计时间复杂度为 O(n) 的算法解决本问题
package 双指针;

import java.util.PriorityQueue;

public class _977_有序数组的平方 {
//    通过优先队列解决
	public int[] sortedSquares(int[] nums) {
    	PriorityQueue<Integer> queue=new PriorityQueue<>();
    	for(int num:nums) {
    		queue.offer(num^2);
    	}
    	int i=0;
    	while(!queue.isEmpty()) {
    		nums[i]=queue.poll();
    		i++;
    	}
    	return nums;
    }
//	ps:效率太低了
	
//	通过双指针解决
    public int[] sortedSquares1(int[] nums) {
//    	定义双指针
    	int left=0,right=nums.length-1,index=right;
//    	设置一个空数组
    	int[] ans=new int[nums.length];
    	while(left<=right) {
//    		如果最右边大于最左边
            int i=nums[left]*nums[left],j=nums[right]*nums[right];
    		if (i<j) {
//    		将最大的数存入
				ans[index]=j;
				right--;
			}else {
				ans[index]=i;
				left++;
			}
    		index--;
    	}
    	return ans;
    }
}

本人csdn博客:https://blog.csdn.net/weixin_46654114

转载说明:跟我说明,务必注明来源,附带本人博客连接。

以上是关于Leetcode刷题100天—977. 有序数组的平方(双指针)—day20的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode刷题100天—26. 删除有序数组中的重复项(数组)—day76

Leetcode刷题100天—26. 删除有序数组中的重复项(数组)—day76

Leetcode刷题100天—88. 合并两个有序数组(数组+双指针)—day23

Leetcode刷题100天—88. 合并两个有序数组(数组+双指针)—day23

Leetcode刷题100天—167. 两数之和 II - 输入有序数组(双指针)—day20

Leetcode刷题100天—167. 两数之和 II - 输入有序数组(双指针)—day20