leetocode--------962. 最大宽度坡

给定一个整数数组 A是元组 (i, j),其中  i < j 且 A[i] <= A[j]。这样的坡的宽度为 j - i

找出 A 中的坡的最大宽度,如果不存在,返回 0 。

示例 1:输入:[6,0,8,2,1,5] 输出:4 解释: 最大宽度的坡为 (i, j) = (1, 5): A[1] = 0 且 A[5] = 5.

示例 2:输入:[9,8,1,0,1,9,4,0,4,1] 输出:7 解释: 最大宽度的坡为 (i, j) = (2, 9): A[2] = 1 且 A[9] = 1.

提示:

  1. 2 <= A.length <= 50000
  2. 0 <= A[i] <= 50000

思路,第一次错误理解了题目以上,理解成了i后面的比它大的数据的个数。这里使用mutiset进行排序,然后从头到后进行分析,统计这个元素i后面元素的个数。同时删除这个元素。

代码为

class Solution {
public:
    int maxWidthRamp(vector<int>& A) {
    	
    multiset<int> si;
    multiset<int>::iterator it;
	int n=A.size();
	for(int i=0;i<n;i++) 
	si.insert(A[i]);
	int imax=1,temp;
	for(int i=0;i<n;i++)
	{
	   temp=A[i];
       
	   it=find(si.begin(),si.end(),temp);
	   int jl=distance(it,si.end());
	   imax=max(imax,jl);
      cout<<jl<<endl;
	   si.erase(it);	
	} 	
     return imax;   
    }
};

上述主要erase的用法,在mutiset中,如果删除rease(value)是删除所有的=value的。删除某个用法是si.erase(it)

正确的代码 

记下数组的元素的位置,然后进行排序,排序后某个元素所在的位置之前的肯定比在它前面的元素小,所以只要找出比它小的原标号最小的即可。

class Solution {
public:
    
	struct node
	{
		int data;
		int id;
	} AA[50000];	
	static bool mycmp(node n1,node n2)
	{
		if(n1.data!=n2.data)
            return n1.data<n2.data;
        return n1.id<n2.id;
	}
    int maxWidthRamp(vector<int>& A) {
    int n=A.size();
	for(int i=0;i<n;i++)
	{
	   AA[i].data=A[i];
	   AA[i].id=i;
	}
    sort(AA,AA+n,mycmp);    
	int tid=AA[0].id,imax=0;
	for(int i=1;i<n;i++)
	{
	   imax=max(imax,AA[i].id-tid);
	   tid=min(tid,AA[i].id);	
       //cout<<imax<<" "<<tid<<endl; 
	}
    
     return imax;   
    }
};

猜你喜欢

转载自blog.csdn.net/qiang_____0712/article/details/85409090