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
}
}