问题:最大宽度坡

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

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

示例 1:

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

示例 2:

  1. 输入:[9,8,1,0,1,9,4,0,4,1]
  2. 输出:7
  3. 解释:
  4. 最大宽度的坡为 (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:

  1. class Solution {
  2. public:
  3. int maxWidthRamp(vector<int>& A) {
  4. int ret = ;
  5. int rightlimit = ;
  6. int predata = -;
  7. for (unsigned int i = ; i < A.size(); i++)
  8. {
  9. if (predata == -)
  10. {
  11. predata = A[i];
  12. }
  13. else
  14. {
  15. if (predata > A[i])
  16. {
  17. predata = A[i];
  18. }
  19. else
  20. {
  21. continue;
  22. }
  23. }
  24. if (A.size() - - i < ret)
  25. {
  26. return ret;
  27. }
  28. for (unsigned int j = A.size()-; j > rightlimit && j-i>ret; j--)
  29. {
  30. steps++;
  31. if (A[j] >= A[i])
  32. {
  33. if (j - i > ret)
  34. {
  35. ret = j - i;
  36. }
  37. rightlimit = j;
  38. break;
  39. }
  40. }
  41. }
  42. return ret;
  43. }
  44.  
  45. };

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

其他:

1.第一code:

  1. class Solution:
  2. def maxWidthRamp(self, A):
  3. """
  4. :type A: List[int]
  5. :rtype: int
  6. """
  7. l = []
  8. for i in range(len(A)):
  9. l.append((A[i], i))
  10. l.sort()
  11. res = 0
  12. small = l[0][1]
  13. for _,e in l:
  14. if e < small:
  15. small = e
  16. else:
  17. if e - small > res:
  18. res = e - small
  19. return res

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

  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<vector>
  4. #include<algorithm>
  5. #include<string>
  6. #include<string.h>
  7. using namespace std;
  8.  
  9. typedef long long LL;
  10. typedef vector<int> VI;
  11.  
  12. #define REP(i,n) for(int i=0, i##_len=(n); i<i##_len; ++i)
  13. #define EACH(i,c) for(__typeof((c).begin()) i=(c).begin(),i##_end=(c).end();i!=i##_end;++i)
  14. #define eprintf(...) fprintf(stderr, __VA_ARGS__)
  15.  
  16. template<class T> inline void amin(T &x, const T &y) { if (y<x) x=y; }
  17. template<class T> inline void amax(T &x, const T &y) { if (x<y) x=y; }
  18. template<class Iter> void rprintf(const char *fmt, Iter begin, Iter end) {
  19. for (bool sp=; begin!=end; ++begin) { if (sp) putchar(' '); else sp = true; printf(fmt, *begin); }
  20. putchar('\n');
  21. }
  22. class Solution {
  23. public:
  24. int maxWidthRamp(vector<int>& A) {
  25. vector<pair<int, int> > t;
  26. REP (i, A.size()) t.emplace_back(A[i], i);
  27. sort(t.begin(), t.end());
  28. int ans = ;
  29. int left = t[].second;
  30. for (int i=; i<(int)t.size(); i++) {
  31. amax(ans, t[i].second - left);
  32. amin(left, t[i].second);
  33. }
  34.  
  35. return ans;
  36. }
  37. };

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 4323——Magic Number——————【dp求编辑距离】2012——MUT——3

    Magic Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tota ...

  2. Web测试相关内容

    Q-1. Web测试的范围是什么? 答. Web测试是软件测试的名称,专注于测试基于Web的应用程序. 在进入生产环境之前,测试团队会对Web应用程序进行详尽的测试. 这有助于发现应用程序中的不同问题 ...

  3. 【转】浅谈https\ssl\数字证书

    转载请注明出处:http://www.cnblogs.com/P_Chou/archive/2010/12/27/https-ssl-certification.html 全球可信的SSL数字证书申请 ...

  4. [转]c#匿名类

    首先让我们看一个例子, 假设我们并没有Person类, 并且我们关心的属性只有Name和Age. 下面的代码演示了我们如何在没有声明类型的情况下来构建一个对象的: 1: var tom = new { ...

  5. 关于web.xml的welcome-file-list 配置与tomcat的关系:

    关于web.xml的welcome-file-list 配置与tomcat的关系: 2018年04月18日 10:17:13 守望dfdfdf 阅读数:377 标签: welcome-file-lis ...

  6. svg的基本图形与属性【小尾巴的svg学习笔记1】

    因为项目有可能用到, 所以学习了一下,做此笔记,图截自慕课网,侵删. 一.基本图形 1.矩形 x,y定义矩形的左上角坐标: width,height定义矩形的长度和宽度: rx,ry定义矩形的圆角半径 ...

  7. DOM 事件冒泡

    1.什么是事件冒泡? 事件冒泡就是从具体到不具体, 例如:当你给了一个button按钮一个点击事件,再给他的父级相同的事件,就会按照,button,body,document,window,继续向上冒 ...

  8. CSS改变placeholder的颜色

    :-moz-placeholder { /* Mozilla Firefox 4 to 18 */ color: #a1a1a1; } ::-moz-placeholder { /* Mozilla ...

  9. C#设计模式--抽象工厂模式(创建型模式)

    一.抽象工厂模式: 在工厂模式中具体的产品和具体的工厂是一一对应的,一个工厂只能生产一种产品,结构单一,例如小米公司刚开始是只生产小米手机,但是伴随着公司的发展,他们需要生产不同型号的手机,也会生产路 ...

  10. 笨办法学Python(二十)

    习题 20: 函数和文件 回忆一下函数的要点,然后一边做这节练习,一边注意一下函数和文件是如何在一起协作发挥作用的. from sys import argv script, input_file = ...