博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Lintcode】 maximum gap
阅读量:4331 次
发布时间:2019-06-06

本文共 2520 字,大约阅读时间需要 8 分钟。

class Solution {public:    /**     * @param nums: a vector of integers     * @return: the maximum difference     */    int maximumGap(vector
nums) { // write your code here int N = nums.size(); if (N < 2) return 0; int m1 = *min_element(nums.begin(),nums.end()); int m2 = *max_element(nums.begin(),nums.end()); if (m1 == m2) return 0; int M = static_cast
(sqrt(N)) + 1; vector
interMin = vector
(M,INT_MAX); vector
interMax = vector
(M,INT_MIN); int W = (m2 - m1)/M + 1; auto a = vector
>(M,vector
{}); for (auto x : nums) { auto index = (x - m1)/W; a[index].push_back(x); interMin[index] = min(interMin[index],x); interMax[index] = max(interMax[index],x); } int ret = 0; for (auto x : a) ret = max(ret,maximumGap(x)); int last = INT_MIN; for (int i = 0;i

自己想了个蠢蠢的递归,是不是O(N)有待商榷

后来看了leetcode上的解答(顺便吐槽一下,这两个题库名字这么像),才知道

N个数有(N-1)个GAP,这些gap一共长m2-m1

平均长度是(double)(m2-m1)/(N-1), 因为CAP大小是整数, 所以最大的GAP比这个平均数大

所以最大GAP的最小值是W=(m2-m1-1)/(N-1) + 1 (注意排除m1=m2的情况)

这个思想是在YYJ老师的组合数学的课上学到的,很好用

另外这里有个小技巧,就是这个gap的表达式把(N-1)是不是整除(m2-m1) 的情况都包含了

这样我保证一个区间里面有W个元素,这个区间里面的最大GAP也是W-1

把x分到第(x-m1)/W个区间,m1分到第0个,m2分到第(m2-m1)/W个区间

//那么m2会不会分到m1的区间呢?不会,因为这样最大的GAP<=W-1与最大GAP最小是W矛盾。

一共有M= (m2-m1)/W+1个区间

这样我只要记录每个区间的最小值和最大值就行了

后来在leetcode上又码了一遍这个算法

class Solution {public:    int maximumGap(vector
& nums) { int N = nums.size(); if (N < 2) return 0; int m1 = *min_element(nums.begin(),nums.end()); int m2 = *max_element(nums.begin(),nums.end()); if (m1 == m2) return 0; int W = (m2 - m1 - 1)/(N - 1) + 1; //W = minGap int M = (m2 - m1)/W + 1; auto v = vector
(M,false); vector
interMin = vector
(M,INT_MAX); vector
interMax = vector
(M,INT_MIN); for (auto x : nums) { auto index = (x - m1)/W; v[index] = true; interMin[index] = min(interMin[index],x); interMax[index] = max(interMax[index],x); } int ret = 0; int last = INT_MIN; for (int i = 0;i < M;i++) { if (!v[i]) continue; if (last >= 0) ret = max(ret,interMin[i] - last); last = interMax[i]; } return ret; }};

 

转载于:https://www.cnblogs.com/soya/p/5235387.html

你可能感兴趣的文章
tomcat 7服务器跨域问题解决
查看>>
前台实现ajax 需注意的地方
查看>>
Jenkins安装配置
查看>>
个人工作总结05(第二阶段)
查看>>
Java clone() 浅拷贝 深拷贝
查看>>
深入理解Java虚拟机&运行时数据区
查看>>
02-环境搭建
查看>>
spring第二冲刺阶段第七天
查看>>
搜索框键盘抬起事件2
查看>>
阿里百川SDK初始化失败 错误码是203
查看>>
透析Java本质-谁创建了对象,this是什么
查看>>
BFS和DFS的java实现
查看>>
关于jquery中prev()和next()的用法
查看>>
一、 kettle开发、上线常见问题以及防错规范步骤
查看>>
eclipse没有server选项
查看>>
CRC码计算及校验原理的最通俗诠释
查看>>
QTcpSocket的连续发送数据和连续接收数据
查看>>
使用Gitbook来编写你的Api文档
查看>>
jquery扩展 $.fn
查看>>
Markdown指南
查看>>