问题:最大宽度坡

给定一个整数数组 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

链接:https://leetcode-cn.com/contest/weekly-contest-116/problems/maximum-width-ramp/

分析:

问题不难,早早的就有了思路 ,可惜一直卡在50000数组超时上 ,好在不断优化(或者Server突然性能给力?)最后十来分钟AC了。

想要找到最大的j-i,满足i<j且A[i]<=A[j]。

基本思路就是二重循环,但是要做一些优化。

1.如果找到了一组符合要求的n1,n2,那么对于后续的m1>n1,其下限m2必须大于n2,才有可能m2-m1>n2-n1(m1>n1) [通过数轴会更直观一些]

2.如果已经有了符合要求的n1,n2,那么对于n11>n1,如果A[n11]>=A[n1],则没必要看,其结果必定小于n1, 比如下标i1,i2,i3依次递增,如果A[i1]<=A[i2],A[i2]<=A[i3],那么A[i1]<=A[i3],i3-i1>i3-i2

3.在第二层循环的时候, 不但对下限有要求,而且m2-m1要大于已知的最大宽度。

AC Code:

class Solution {
public:
int maxWidthRamp(vector<int>& A) {
int ret = ;
int rightlimit = ;
int predata = -;
for (unsigned int i = ; i < A.size(); i++)
{
if (predata == -)
{
predata = A[i];
}
else
{
if (predata > A[i])
{
predata = A[i];
}
else
{
continue;
}
}
if (A.size() - - i < ret)
{
return ret;
}
for (unsigned int j = A.size()-; j > rightlimit && j-i>ret; j--)
{
steps++;
if (A[j] >= A[i])
{
if (j - i > ret)
{
ret = j - i;
}
rightlimit = j;
break;
}
}
}
return ret;
} };

虽然AC了,完赛后查看通过时间,98个测例,用时1880ms,还有很大的优化空间。

其他:

1.第一code:

class Solution:
def maxWidthRamp(self, A):
"""
:type A: List[int]
:rtype: int
"""
l = []
for i in range(len(A)):
l.append((A[i], i))
l.sort()
res = 0
small = l[0][1]
for _,e in l:
if e < small:
small = e
else:
if e - small > res:
res = e - small
return res

刚注意到国内和国外排行榜是分离的,国际版第一code:

#include<stdio.h>
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<string.h>
using namespace std; typedef long long LL;
typedef vector<int> VI; #define REP(i,n) for(int i=0, i##_len=(n); i<i##_len; ++i)
#define EACH(i,c) for(__typeof((c).begin()) i=(c).begin(),i##_end=(c).end();i!=i##_end;++i)
#define eprintf(...) fprintf(stderr, __VA_ARGS__) template<class T> inline void amin(T &x, const T &y) { if (y<x) x=y; }
template<class T> inline void amax(T &x, const T &y) { if (x<y) x=y; }
template<class Iter> void rprintf(const char *fmt, Iter begin, Iter end) {
for (bool sp=; begin!=end; ++begin) { if (sp) putchar(' '); else sp = true; printf(fmt, *begin); }
putchar('\n');
}
class Solution {
public:
int maxWidthRamp(vector<int>& A) {
vector<pair<int, int> > t;
REP (i, A.size()) t.emplace_back(A[i], i);
sort(t.begin(), t.end());
int ans = ;
int left = t[].second;
for (int i=; i<(int)t.size(); i++) {
amax(ans, t[i].second - left);
amin(left, t[i].second);
} return ans;
}
};

LeetCode962. 最大宽度坡的更多相关文章

  1. [Swift]LeetCode962. 最大宽度坡 | Maximum Width Ramp

    Given an array A of integers, a ramp is a tuple (i, j) for which i < j and A[i] <= A[j].  The ...

  2. Leetcode962. Maximum Width最大宽度坡 Ramp

    给定一个整数数组 A,坡是元组 (i, j),其中  i < j 且 A[i] <= A[j].这样的坡的宽度为 j - i. 找出 A 中的坡的最大宽度,如果不存在,返回 0 . 示例 ...

  3. Swift LeetCode 目录 | Catalog

    请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift    说明:题目中含有$符号则为付费题目. 如 ...

  4. LeetCode刷题总结-数组篇(番外)

    本期共7道题,三道简单题,四道中等题. 此部分题目是作者认为有价值去做的一些题,但是其考察的知识点不在前三篇总结系列里面. 例1解法:采用数组索引位置排序的思想. 例2解法:考察了组合数学的组合公式应 ...

  5. 49.UILable宽度高度自适应

    第一种: UILabel *labl = [[UILabel alloc]init]; labl.backgroundColor = [UIColor redColor]; labl.numberOf ...

  6. HTML 获取屏幕、浏览器、页面的高度宽度

    本篇主要介绍Web环境中屏幕.浏览器及页面的高度.宽度信息. 目录 1. 介绍:介绍页面的容器(屏幕.浏览器及页面).物理尺寸与分辨率.展示等内容. 2. 屏幕信息:介绍屏幕尺寸信息:如:屏幕.软件可 ...

  7. Jquery对网页高度、宽度的操作

    Jquery获取网页的宽度.高度 网页可见区域宽: document.body.clientWidth 网页可见区域高: document.body.clientHeight 网页可见区域宽: doc ...

  8. 我的MYSQL学习心得(二) 数据类型宽度

    我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  9. android手机旋转屏幕时让GridView的列数与列宽度自适应

    无意中打开了一年前做过的一个android应用的代码,看到里面实现的一个小功能点(如题),现写篇文章做个笔记.当时面临的问题是,在旋转屏幕的时候需要让gridview的列数与宽度能自适应屏幕宽度,每个 ...

随机推荐

  1. HDU 2819 ——Swap——————【最大匹配、利用linker数组、邻接表方式】

     Swap Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status ...

  2. output引用类型

    1.创建存储过程,将参数avg设置为引用参数,可以对参数有反馈作用 ), @avg float output) as select @avg=AVG(price) from goods where g ...

  3. intellijidea课程 intellijidea神器使用技巧 6-1 Spring的关联

    待学完spring之后再来看 Spring的关联位置:菜单->File->Project Structure->Facets功能:帮助管理Spring容器.还提供了很多其他的管理,比 ...

  4. python反爬之网页局部刷新1

    # ajax动态加载网页 # 怎样判断一个网页是不是动态加载的呢? # 查看网页源代码,如果源码中没有你要的数据,尝试访问下一页,当你点击下一页的时候,整个页面没有刷新, 只是局部刷新了,很大的可能是 ...

  5. poi3.8随记

    System.out.println(sheet.getFirstRowNum());//结果是0 System.out.println(sheet.getLastRowNum());//如果一共有3 ...

  6. MotionEvent的getX(),getY()与getRawX(),getRawY()区别

    在Android的View中getX  getRawX获取的坐标是不一样的,只是相对比照的对象不一样而已. 1.在View中: getX()是表示Widget相对于自身左上角的x坐标,而getRawX ...

  7. Mvc过滤器的使用【转载】

    前言 在开发大项目的时候总会有相关的AOP面向切面编程的组件,而MVC(特指:Asp.Net MVC,以下皆同)项目中不想让MVC开发人员去关心和写类似身份验证,日志,异常,行为截取等这部分重复的代码 ...

  8. KinSlideshow焦点图轮播插件

    KinSlideshow默认设置效果代码: *焦点图显示的标题为 img 中 alt 属性中的文字 *当只有一张图片时不显示按钮,但也会有无缝切换效果 * jquery ..以上版本 jvascrip ...

  9. 如何在js中获取到服务器端控件并给其赋值

    如下所示:lbID为服务器端控件ID document.getElementById('<%=lbID.ClientID%>').value = "赋值";

  10. Spring MVC框架下提交Date数据无法在controller直接接收

    主要有两步,controller中添加initBinder方法,再创建一个时间类型数据转换类就OK了. 1.在Controller中创建方法: // 相关包 import java.text.Date ...