好朋友身高

题目描述:
在学校中,N个小朋友站成一队, 第i个小朋友的身高为height[i],
第i个小朋友可以看到的第一个比自己身高更高的小朋友j,那么j是i的好朋友(要求j > i)。
请重新生成一个列表,对应位置的输出是每个小朋友的好朋友位置,如果没有看到好朋友,请在该位置用0代替。
小朋友人数范围是 [0, 40000]。

输入描述:
第一行输入N,N表示有N个小朋友
第二行输入N个小朋友的身高height[i],都是整数

输出描述:
输出N个小朋友的好朋友的位置

解题思路:
嵌套遍历,每遍历一个元素再到后面去找比他大的。
还有一种用栈来求解的算法,我再想想

`#include
using namespace std;

int main(){
int N,a[40001]={0},flag;
cin>>N;
for(int i=0;i<N;i++)
{
cin>>a[i];
}
for(int i=0;i<N;i++)
{
flag=0;
for(int j=i+1;j<N;j++)
{
if(a[j]>a[i])
{
a[i]=j;
flag=1;
break;
}
}
if(flag==0)
a[i]=0;
}
for(int i=0;i<N;i++)
cout<<a[i]<<" ";
return 0;
} `

时间复杂度:O(n^2).
空间复杂度:O(n)

新的解题思路想到啦,感谢chatGPT:用栈可以非常快的实现这个问题。
一遍遍历,遍历过程中将小于栈顶元素的值入栈,否则重复输出栈中小于当前值的元素,直到栈顶值大于当前值或者栈为空。遍历完之后若栈中还有元素则将这些元素对应的结果为0;
`#include<stdio.h>

include <stdlib.h>

typedef struct{
int index;
int height;
}friend;

int main(){
int n,top=-1;
scanf("%d",&n);
int *heights=(int )malloc(nsizeof(int));
int *result=(int *)calloc(n,sizeof(int));
friend *sta=(friend )malloc(nsizeof(friend));
for(int i=0;i<n;i++)
{
scanf("%d",&heights[i]);
}
for(int i=0;i<n;i++)
{
while(top>=0&&sta[top].height<heights[i])
{
result[sta[top].index]=i;
top--;
}
++top;
sta[top].height=heights[i];
sta[top].index=i;
}
while(top>=0)
{
result[sta[top--].index]=0;
}
for(int i=0;i<n;i++)
printf("%d ",&result[i]);
free(heights);
free(result);
free(sta);
return 0;
} `
时间复杂度:每个元素遍历了一遍,时间复杂度为:O(n);
空间复杂度:使用了三个数组,两个整型数组和一个结构体数组,其中结构体数组包含两个整型变量,空间复杂度为:O(n);
总结:
1、使用malloc和calloc函数时需要引入stdlib.h库
2、malloc,一个参数表示空间大小,分配空见不会初始化,但是效率高。calloc两个参数,表示数组个数和单个空间大小,分配空间会初始化0,效率会低一点。最后使用完之后记得free掉。
3、新的解法可以降低时间复杂度,但是不容易想。

posted @   jenniferCAI  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示