有序数组的平方
题目链接
题目:给你一个按非递减顺序排序的整数数组 nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。
//暴力
#include<stdio.h>
void sort(int *nums,int n){
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++){
if(nums[i]>nums[j]){
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
}
}
int main(){
int nums[]={-4,-1,0,3,10};
int n=sizeof(nums)/sizeof(nums[0]);
for(int i=0;i<n;i++)
nums[i]=nums[i]*nums[i];
sort(nums,n);
for(int i=0;i<n;i++)
printf("%d ",nums[i]);
}
聪明方法:双指针
数组其实是有序的,只不过负数平方之后可能成为最大数了。那么数组平方的最大值就在数组的两端,不可能是中间。此时可以考虑双指针,分别指向头和尾。
并且此题没规定空间复杂度,故可以新建一个数组。
//双指针
//学会这个思想的变化
#include<stdio.h>
int main(){
int nums[]={-11,-2,3,4,5,6,7};
int n=sizeof(nums)/sizeof(nums[0]);
int result[n];//构建一个新数组
int k=n-1;//作为新数组的索引
//***由于原数组两边的平方比中间大,并且大的要在新数组后面,故初始值为n-1
for(int i=0,j=n-1;i<=j;){ //定义两个指向头和尾的索引;注意:i<=j,因为最后还有一个元素要加进去
if(nums[i]*nums[i]<nums[j]*nums[j]){
result[k--]=nums[j]*nums[j];
j--;
}
else{
result[k--]=nums[i]*nums[i];
i++;
}
}
for(int i=0;i<n;i++)
printf("%d ",result[i]);
}