LeetCode962. 最大宽度坡

问题:最大宽度坡

给定一个整数数组 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 = 0;
        int rightlimit = 0;
        int predata = -1;
        for (unsigned int i = 0; i < A.size(); i++)
        {
            if (predata == -1)
            {
                predata = A[i];
            }
            else
            {
                if (predata > A[i])
                {
                    predata = A[i];
                }
                else
                {
                    continue;
                }
            }
            if (A.size() - 1 - i < ret)
            {
                return ret;
            }
            for (unsigned int j = A.size()-1; 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=0; 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 = 0;
    int left = t[0].second;
    for (int i=1; i<(int)t.size(); i++) {
        amax(ans, t[i].second - left);
        amin(left, t[i].second);
    }

    return ans;
    }
};

原文地址:https://www.cnblogs.com/youdias/p/10163905.html

时间: 2024-11-05 16:25:44

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

leet

# 题名1 两数之和    2 两数相加    3 无重复字符的最长子串    4 寻找两个有序数组的中位数    5 最长回文子串    6 Z 字形变换    7 整数反转    8 字符串转换整数 (atoi)    9 回文数    10 正则表达式匹配    11 盛最多水的容器    12 整数转罗马数字    13 罗马数字转整数    14 最长公共前缀    15 三数之和    16 最接近的三数之和    17 电话号码的字母组合    18 四数之和    19 删除链表

七 放坡(Grading)

放坡在civil3d中是一个强大而又常用的工具.主要用于土地平整.水池的填挖方量计算.边坡的开挖等. 点击[放坡]按钮下的[放坡创建工具]打开放坡工具条      首先在模型空间中创建一个多段线用于放坡,并将多段线的标高设为合适的值,比如池底标高(从池底外放坡) 点击放坡工具条中的[设定放坡组]按钮,弹出[创建放坡组]对话框,给放坡组起一个名称,后缀为放坡组,然后点击确定,会弹出创建曲面对话框,曲面的名称就是刚才的放坡组名称,点击确定 这时注意左侧工具空间中的曲面和场地之下,会自动创建一个曲面和

七 放坡2之放坡规则(Grading Criteria)

今天给大家继续讲一下有关放坡规则(Grading Criteria)的东西,通过一个简单的例子演示放坡规则的创建及使用. 放坡的横断面如下:第一个平台标高为120,宽度为30,以1:1的坡度放坡到第二个平台,其标高为70,最后以再以1:1的坡度放坡到地面. 创建一个多段线,用于充当放坡的起始边,将其标高设置为120,如下图: 点击[放坡]下的[创建放坡工具],弹出放坡工具条 点击[新建]按钮,创建一个新的放坡标准,名称为"相对高程-距离",含义是:高程方向使用相对高程,水平方向使用距离

移动页面HTML5自适应手机屏幕宽度

网上关于这方面的文章有很多,重复的东西本文不再赘述,仅提供思路,并解释一些其他文章讲述模糊的地方. 1.使用meta标签,这也是普遍使用的方法,理论上讲使用这个标签是可以适应所有尺寸的屏幕的,但是各设备对该标签的解释方式及支持程度不同造成了不能兼容所有浏览器或系统. 首先解释该标签的含义: <meta name="viewport" content="width=device-width,initial-scale=1.0, minimum-scale=1.0, max

gis制作高程、坡度、坡向分析图&#160;

ArcGIS教程之DEM(高程)的应用(坡度坡向.提等高线) 相关教程:           DEM水文分析(一)           Arcgis下DEM水文分析(二) DEM的应用包括:坡度:Slope.坡向:Aspect.提取等高线.算地形表面的阴影图.可视性分析.地形剖面.水文分析等,其中涉及的知识点有: a)掌握根据DEM 计算坡度.坡向的方法.     b)理解基于DEM数据进行水文分析的基本原理.     c)利用ArcGIS的提供的水文分析工具进行水文分析的基本方法和步骤. 第一

转载:CSS里面div宽度的问题

转自http://www.lyblog.net/detail/286.html 小天地,大世界[http://www.lyblog.net] 从刚开始接触CSS到现在,一般用的单位都是像素这种绝对的单位.简单方便,而且还不容易出现一些莫名其妙的问题.优点听起来不错,缺点也还是很多的,比 如说:页面缺乏灵活性,自适应性不强······ 那么有什么好的解决方法吗?有,不过咱还是把范围缩小,就放在width:100%个这相对单位上来看看. 理论篇 width:100%的相对于谁 想必学过CSS,了解了

动态设置图片的宽度和高度

动态设置图片控件的宽度和高度: imageView.getLayoutParams().width=600;imageView.getLayoutParams().height=400; 设置图片(src): imageView.setImageResource(resId); android获得屏幕高度和宽度: 1.WindowManager wm = (WindowManager) getContext()                     .getSystemService(Cont

windows 任务栏图标宽度固定

这个需要修改注册表. win+r regedit ->enter 找到以下项 HKEY_CURRENT_USER-Control Panel-Desktop-WindowsMetrics 新建字符键值.. MinWidth 54 MaxWidth 55 注销重新登录.. 效果如图. windows 任务栏图标宽度固定,码迷,mamicode.com

react-native 获取组件的宽度和高度

react-native 获取组件的尺寸有两种方式,第一种方式使用元素自身的onLayout属性去获取,但是这种方式有一个局限性,就是只有在初次渲染的时候才会触发这个函数,而且此种方法获取的是组件相对于父组件的位置坐标.如果我们需要随时都可以去获取组件的尺寸或者相对于屏幕的位置坐标时,这种方式并不适合. 那么这里我们就来看下第二种方式,使用react-native中的findNodeHandle和UIManager来获取组件的尺寸: import { findNodeHandle, UIMana