1. 题⽬链接:天使果冻
2. 题⽬描述:
3. 解法:
算法思路:
需要两个数组绑定后排序,因此可以搞⼀个pair存⼀下,然后排序。
C++算法代码:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
//初始化
int n;
cin>>n;
vector<int>temp(n);
for(int i=0;i<n;i++)
{
cin>>temp[i];
}
//找出第i位置之前的最大值
vector<int>max_num(n,0);
max_num[0]=temp[0];
//找出第i个位置上第二大的值
vector<int>second(n,0);
for(int i=1;i<n;i++)
{
//分类讨论
//若新加入的数与最大值相等或者更大,则原来的最大值变为第二大
if(temp[i]>=max_num[i-1])
{
second[i]=max_num[i-1];
}
//若新加入的数在第二大和最大数之间,则新来的数为第二大
else if(temp[i]>=second[i-1]&&temp[i]<max_num[i-1])
{
second[i]=temp[i];
}
//若新来的数比第二大还小,则第二大的数据不变
else if(temp[i]<second[i-1])
{
second[i]=second[i-1];
}
max_num[i]=max(max_num[i-1],temp[i]);
}
//计算
int q,x;
cin>>q;
while(q--)
{
cin>>x;
cout<<second[x-1]<<endl;
}
return 0;
}
Java算法代码:
import java.util.*;
public class Main
{
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] arr = new int[n + 1];
for (int i = 1; i <= n; i++)
{
arr[i] = in.nextInt();
}
// 更新最⼤值以及次⼤值shuzu
int[] f = new int[n + 1];
int[] g = new int[n + 1];
f[1] = arr[1];
for (int i = 2; i <= n; i++)
{
int x = arr[i];
f[i] = Math.max(f[i - 1], x);
if (x >= f[i - 1]) g[i] = f[i - 1];
else if (x >= g[i - 1]) g[i] = x;
else g[i] = g[i - 1];
}
int q = in.nextInt();
while (q-- != 0)
{
int x = in.nextInt();
System.out.println(g[x]);
}
}
}