java leetcode之[动态规划 简单]977. 有序数组的平方

题目的链接在这里:https://leetcode-cn.com/problems/squares-of-a-sorted-array/


题目大意

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

一、示意图

在这里插入图片描述

二、解题思路

双指针

双指针

代码如下:

class Solution {
  final static int n=10000;
    public int[] sortedSquares(int[] nums) {
        //给一个非递减数组 返回每个数组的平方 然后也按照非递减排序
        //把第一个指针指向第一个正数
        int start=n;
        for(int i=0;i<nums.length;i++){
            //找到第一个正数就终止循环
            if(nums[i]>=0){
               start=i;
               break;
            }
        }

        int[] result=new int[nums.length];
        int index=0;
        //先进行一些特殊判断
        if(start==0){
            //也就是全都是正数
            while (index<nums.length){
                result[index]=(nums[index]*nums[index]);
                index++;
            }
            return result;
        }
        if(start==n){
            //说明没有一个数是大于0的 那就全都是小于0 的 就需要从后往前
            while (index<nums.length){
                result[index]=(nums[nums.length-1-index]*nums[nums.length-1-index]);
                index++;
            }
            return result;
        }

        //说明start在中间
        //先初始  这里需要让star和右边第一个负数进行比较
    /*    result[index]=nums[start]*nums[start];
        index++;*/
        int left=start-1;
        int right=start+1;
        
        if(Math.abs(nums[left])>nums[start]){
            //说明左边的比较大
            result[index++]=nums[start]*nums[start];
        }
        else{
            //说明负数比较小
            result[index++]=nums[left]*nums[left];
            //然后进行更新
            left--;
            right=start;
        }
        //就是进行判断
        while (left>=0&&right<nums.length){
            //就进行判断
            int leftNum=nums[left]*nums[left];
            int rightNum=nums[right]*nums[right];
            if(leftNum>rightNum){
                //那就是需要rightNum的操作
                result[index++]=rightNum;
                //然后right就需要右移
                right++;
            }else{
                //说明左边比较小
                result[index++]=leftNum;
                //然后左边左边左移
                left--;
            }
        }
        //可能会出现其中一个条件还满足的情况
        while (left>=0){
            result[index++]=nums[left]*nums[left];
            left--;
        }
        while (right<nums.length){
            result[index++]=nums[right]*nums[right];
            right++;
        }

        return result;

    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值