0
点赞
收藏
分享

微信扫一扫

有序数组的平方(每日一题)

题目

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

输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]
排序后,数组变为 [0,1,9,16,100]

暴力解法

将数组每个数平方后排序

 public int[] sortedSquares(int[] nums) {
        for(int i=0;i<nums.length;i++){
            nums[i]=nums[i]*nums[i];
        }
        int t;
        for(int i=0;i<nums.length-1;i++)
        for(int j=i+1;j<nums.length;j++)
        {
            if(nums[i]>nums[j])
            {
                t=nums[i];
                nums[i]=nums[j];
                nums[j]=t;
            }
        }
        return nums;
    }

这个解法还可以将后面的排序语句用Arrays.sort()代替

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

该题也可以用双指针解决。大概思路是,找到这个有序数组负数和非负数的分界线,用类似归并排序的方法,将负数和非负数平方后的结果比较后放入一个新数组中。 

 public int[] sortedSquares(int[] nums) {
        int n = nums.length;
        int a,b,negative=-1;
        for (int i = 0; i < n; ++i) {
            if (nums[i] < 0) {
                negative = i;
            } else {
                break;
            }
        }
        b=negative+1;//第一个非负数
        a=negative;//第一个负数
        int[] ans = new int[n];
        int j=0;
        while(j<n)
     {
            if(a<0)
        {
            ans[j]=nums[b]*nums[b];
            j++;
            b++;
        }
        else if(b>n-1)
        {
            ans[j]=nums[a]*nums[a];
            j++;
            a--;
        }
        else if(nums[a]*nums[a]>nums[b]*nums[b])
        {
            ans[j]=nums[b]*nums[b];
            j++;
            b++;
        }
        else
        {
            ans[j]=nums[a]*nums[a];
            j++;
            a--;
        }

     }
        return ans;
    }
    
举报

相关推荐

0 条评论