他们人手一把玩具枪,并且他们喜欢把枪举在头顶上。
每一次练习射击,他们都会朝正前方发射一发水弹。
这个时候,第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; }提交观点