LeetCode(977):有序数组的平方

有序数组的平方

题目链接

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

cpp 复制代码
//暴力 
#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]);
} 

聪明方法:双指针

数组其实是有序的,只不过负数平方之后可能成为最大数了。那么数组平方的最大值就在数组的两端,不可能是中间。此时可以考虑双指针,分别指向头和尾。

并且此题没规定空间复杂度,故可以新建一个数组。

cpp 复制代码
//双指针
//学会这个思想的变化
#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]);
} 
相关推荐
一支闲人12 分钟前
C语言相关简单数据结构:双向链表
c语言·数据结构·链表·基础知识·适用于新手小白
姜不吃葱32 分钟前
【力扣热题100】双指针—— 接雨水
数据结构·算法·leetcode·力扣热题100
zzx_blog1 小时前
简单易懂的leetcode 100题-第三篇 移动0,颜色分类,数组中的第K个最大元素
leetcode·面试
John.Lewis1 小时前
数据结构初阶(19)外排序·文件归并排序的实现
c语言·数据结构·排序算法
John.Lewis1 小时前
数据结构初阶(16)排序算法——归并排序
c语言·数据结构·排序算法
qq_513970441 小时前
力扣 hot100 Day76
算法·leetcode·职场和发展
wearegogog1232 小时前
C语言中的输入输出函数:构建程序交互的基石
c语言·开发语言·交互
艾莉丝努力练剑14 小时前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
Cx330❀15 小时前
【数据结构初阶】--排序(五):计数排序,排序算法复杂度对比和稳定性分析
c语言·数据结构·经验分享·笔记·算法·排序算法
..过云雨16 小时前
01.【数据结构-C语言】数据结构概念&算法效率(时间复杂度和空间复杂度)
c语言·数据结构·笔记·学习