leetcode :977 题

需求:

给定一个有序数组,返回数组所有元素平方之后的结果,要求平方后的数组依然有序。

注意:数组是有负数的。例:[-5,1,2,3]

暴力解法:先平方,后使用排序算法排序。

双指针思路:

根据数组可以看出 <- [-5,1,2,3] -> , 平方后的数组的大小是从两边往中间逐渐缩小的。所以思路如下:

1.定义最左,最右两个指针,和一个新数组。

2.通过判断左右两个指针指向的值 谁最大,将最大的值存入新数组(从数组尾部开始存放,因为是升序)。

3.移动前一个最大值的指针(往中间),继续比较。直到将所有元素都存放到新数组。

C#:

public class Solution {
    public int[] SortedSquares(int[] nums) {
        var result = new int[nums.Length];
        int k=nums.Length -1 ;
        for (int i=0,j=k;i<=j;)
        {
            if((nums[i] * nums[i]) > (nums[j] * nums[j]))
            {
                result[k--] = nums[i] * nums[i++];
            }
            else 
            {
                result[k--] = nums[j] * nums[j--];
            }
        }
        return result;
    }
}

rust:

impl Solution {
    pub fn sorted_squares(nums: Vec<i32>) -> Vec<i32> {
        let mut result = nums.clone();
        let mut k = result.len() -1 ;
        let mut i = 0;
        let mut j = nums.len() -1;
        while i <= j
        {
            if (nums[j] *nums[j]) > (nums[i] * nums[i]) 
            {
                result[k] = nums[j] * nums[j];
                j-=1;
                k-=1;
            }
            else 
            {
                result[k] = nums[i] *nums[i];
                i+=1;
                k-=1;
            }
        }
        result
    }
}