给定一个整数数组 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.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-width-ramp
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
//绑定数字和索引的关系
struct node{
int val;
int idx;
node(int v,int i):val(v),idx(i){}//构造函数声明
};
//谓词
//我们可以使用 static 关键字来把类成员定义为静态的。当我们声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本。
//静态成员在类的所有对象中是共享的。
//如果不存在其他的初始化语句,在创建第一个对象时,所有的静态数据都会被初始化为零。我们不能把静态成员的初始化放置在类的定义中,但是可以在类的外部通过使用范围解析运算符 :: 来重新声明静态变量从而对它进行初始化
static bool cmp(node a,node b){
if(a.val == b.val) return a.idx< b.idx;
return a.val<b.val;
}
int maxWidthRamp(vector<int>& A) {
//0 1 2 5 6 8 对原数组排序
//1 4 3 5 0 2 索引
//从小到大排序,当前索引减去最小索引
//当前索引减去的都是比这个数小的索引
int len = A.size();
int ans = 0,idx = len;
vector<node> v;
for(int i=0;i<len;i++){
v.push_back(node(A[i],i));
}
sort(v.begin(),v.end(),cmp);
for(int i=0;i<len;i++){
ans = max(ans,v[i].idx-idx);
idx = min(idx,v[i].idx);
}
return ans;
}
};