他们人手一把玩具枪,并且他们喜欢把枪举在头顶上。
每一次练习射击,他们都会朝正前方发射一发水弹。
这个时候,第i个人射击的水弹,就会击中在他前面第一个比他高的人。
牛牛认为这样的练习十分的荒唐,完全就是对长得高的人的伤害。
于是它定义了一个荒唐度,初始为0。
对于第i个人,如中他击中了第j个人,则荒唐度加j,如果没有击中任何人,则荒唐度加0.
牛牛想问你,你能计算出荒唐度是多少吗?
他们人手一把玩具枪,并且他们喜欢把枪举在头顶上。
每一次练习射击,他们都会朝正前方发射一发水弹。
这个时候,第i个人射击的水弹,就会击中在他前面第一个比他高的人。
牛牛认为这样的练习十分的荒唐,完全就是对长得高的人的伤害。
于是它定义了一个荒唐度,初始为0。
对于第i个人,如中他击中了第j个人,则荒唐度加j,如果没有击中任何人,则荒唐度加0.
牛牛想问你,你能计算出荒唐度是多少吗?
5,[1,2,3,4,5]
0
没有一个人击中任何一个人
5,[5,4,3,2,1]
10
第二个人击中第一个人,第三个人击中第二个人,第四个人击中第三个人,第五个人击中第四个人; 1+2+3+4=10
一个整数n()
一个数组a()
a下标从0开始,
class Solution {
public:
//
long long solve(int n, vector<int>& a) {
// write code here
long long res=0;
stack<pair<int,int>> S;
S.push({a[0],1});
for(int i=1;i<n;i++){
while(!S.empty()){
if(S.top().first<=a[i])
S.pop();
else
break;
}
if(!S.empty())
res+=S.top().second;
S.push({a[i],i+1});
}
return res;
}
}; import java.util.*;
public class Solution {
public long solve (int n, int[] a) {
if(n<=1){
return 0;
}
long score=0l;
for(int i=0;i<n;i++)
for(int j=i;j>=0;j--){
if(a[j]>a[i]){
score+=j+1;
break;
}
}
return score;
}
} 第二种解法:栈 import java.util.*;
public class Solution {
public long solve (int n, int[] a) {
if(n<=1){
return 0;
}
// write code here
Stack<Integer> s=new Stack<>();
long score=0l;
for(int i=0;i<n;i++){
//寻找到大于当前结点的结点时退出
while(!s.empty()&&a[s.peek()]<=a[i]){
s.pop();
}
while(!s.empty()){
score+=s.peek()+1;
}
//保存每一个下标
s.push(i);
}
return score;
}
} class Solution {
public:
/**
*
* @param n int整型 n个人
* @param a int整型vector ai代表第i个人的高度
* @return long长整型
*/
long long solve(int n, vector<int>& a) {
long long s = 0;
stack<int> S;
for(int i=0;i<n;i++){
while(!S.empty() && a[S.top()]<=a[i])
S.pop();
if(!S.empty())
s += S.top()+1;
S.push(i);
}
return s;
}
}; 这题写的用栈,结果比暴力浪费空间,时间还慢。。。
用栈的代码如下:
import java.util.*;
public class Solution {
/**
*
* @param n int整型 n个人
* @param a int整型一维数组 ai代表第i个人的高度
* @return long长整型
*/
public long solve (int n, int[] a) {
// write code here
Stack<Integer> s = new Stack<>();
Map<Integer,Integer> map =new HashMap<>();
if(n<=1){
return 0;
}
long res = 0;
s.add(a[0]);
map.put(a[0],1);
for (int i=1;i<n;i++){
while (!s.isEmpty()&&a[i]>=s.peek()){
s.pop();
}
if (s.isEmpty()){
s.add(a[i]);
map.put(a[i],i+1);
}else {
res+=map.get(s.peek());
s.add(a[i]);
map.put(a[i],i+1);
}
}
return res;
}
}
public class Solution {
/**
*
* @param n int整型 n个人
* @param a int整型一维数组 ai代表第i个人的高度
* @return long长整型
*/
public long solve (int n, int[] a) {
int max=a[0];
int index=0;
long sum=0;
for(int i=1;i<n;i++){
if(max<=a[i]){
//保存当下最高
max=a[i];
index=i;
}else{
for(int j=i-1;j>=index;j--){
if(a[i]<a[j]){
sum+=j;
//数组下标从0+导致的问题
sum++;
break;
}
}
}
}
return sum;
} class Solution: def solve(self , n , a ): res = 0 compa = [(a[0],1)] for i in range(1,n): while compa and a[i]>=compa[-1][0]: compa.pop() compa.append((a[i],i+1)) if len(compa)!=1: res += compa[-2][-1] return res
import java.util.*;
public class Solution {
/**
*
* @param n int整型 n个人
* @param a int整型一维数组 ai代表第i个人的高度
* @return long长整型
*/
public long solve (int n, int[] a) {
// write code here
long ht=0;
int[] hts=new int[n];
int pre=0,ppre=0;
if(n<=1){
return 0;
}
if(a[0]>a[1]){
ht=1;
hts[1]=1;
}
if(n==2){
return ht;
}
pre=1;
ppre=hts[pre-1];
for(int i=2;i<n;i++){
if(a[i]<a[i-1]){
hts[i]=i;
}else{
pre=i-1;
while(a[i]>=a[pre]&&(ppre=hts[pre])!=0){
if(a[i]<a[ppre-1]){
hts[i]=ppre;
break;
}else{
pre=ppre-1;
}
}
}
ht+=hts[i];
}
return ht;
}
} class Solution: def solve(self , n , a ): stack=[] res=0 for i in range(n): while(len(stack) and a[stack[len(stack)-1]]<=a[i]): stack.pop() if len(stack): res = res + stack[len(stack)-1]+1 stack.append(i) return res
long long solve(int n, vector<int>& a) {
// write code here
int len=(int)a.size();
vector<int> r(len); // 在第i个人d前方,最接近i的比i高的人是r[i]
r[0]=-1;// -1表示在其前方没有人比a[i]高
for(int i=1;i<len;i++){
int j=i-1;
while(a[i]>=a[j] && j>=0){
j=r[j];
}
r[i]=j;
}
long long ans=0;
for(auto &k : r) ans+=k+1;
return ans;
} 提交观点