【leetcode】Maximum Gap(hard)★
Given an unsorted array, find the maximum difference between the successive elements in its sorted form.
Try to solve it in linear time/space.
Return 0 if the array contains less than 2 elements.
You may assume all elements in the array are non-negative integers and fit in the 32-bit signed integer range.
思路:
这是一道难题,难点在于不能排序,但是要找到在排序的情况下相邻数字的最大差。
各种想不出来,很low的用了排序,居然也通过了。
然后看答案,发现可以很巧妙的利用桶的思想。找到数组里面的最大值和最小值,则数字间隔gap满足:
gap >= (max - min) / (N - 1) 结果向下取整 注意gap = 0 时取 1, 防止后面除0
然后,可以分为 (max - min) / gap + 1 个桶
每个数字根据 (num[i] - min) / gap 来决定放在哪个桶里。
记录每个桶里的最大值和最小值。
则最大间隔不会在桶内,而会在相邻的桶之间,bucket[i].min - bucket[i - 1].max 中最大的数字就是目标数字。
//这个虽然通过了,但是用了排序,是O(nlogn)的算法
int maximumGap(vector<int> &num) {
int ans = ;
sort(num.begin(), num.end());
for(int i = ; i < num.size(); i++)
{
ans = num[i] - num[i - ];
}
return ans;
}
---------------------------------------------------------------------------------
//答案的思路
int maximumGap1(vector<int> &num) {
if(num.size() < ) return ;
//第一步,找最大和最小值
int maxnum = num[];
int minnum = num[];
for(int i = ; i < num.size(); i++)
{
maxnum = (maxnum < num[i]) ? num[i] : maxnum;
minnum = (minnum > num[i]) ? num[i] : minnum;
}
//第二步:判断间隔的大小
int gap = (maxnum - minnum) / (num.size() - );
gap = (gap == ) ? : gap;
//判断和记录每个桶的最大和最小数字
vector<vector<int>> bucket((maxnum - minnum) / gap + , vector<int>(, -)); //只需记录每个桶的最大和最小数字
for(int i = ; i < num.size(); i++)
{
int belong = (num[i] - minnum) / gap;
bucket[belong][] = (num[i] > bucket[belong][]) ? num[i] : bucket[belong][]; //更新最大值
bucket[belong][] = (bucket[belong][] < || num[i] < bucket[belong][]) ? num[i] : bucket[belong][]; //更新最小值
} //找最大间隔
int ans = ;
int pre = ;
for(int i = ; i < bucket.size(); i++)
{
if(bucket[i][] == -) continue;
ans = (bucket[i][] - bucket[pre][] > ans) ? bucket[i][] - bucket[pre][] : ans;
pre = i;
}
return ans;
}
网上还有一种方法是利用基数排序,我还没看。
int maximumGap(std::vector<int> &num) {
    for(unsigned bit = ; bit < ; bit++)
    std::stable_partition(num.begin(), num.end(), [bit](int a){
        return !(a & ( << bit));
    });
    int difference = ;
    for(std::size_t i = ; i < num.size(); i++) {
        difference = std::max(difference, num[i] - num[i-]);
    }
    return difference;
}
【leetcode】Maximum Gap(hard)★的更多相关文章
- 【leetcode】Maximum Gap
		Maximum Gap Given an unsorted array, find the maximum difference between the successive elements in ... 
- 【leetcode】Maximum Subarray (53)
		1. Maximum Subarray (#53) Find the contiguous subarray within an array (containing at least one nu ... 
- 【leetcode】Maximum Subarray
		Maximum Subarray Find the contiguous subarray within an array (containing at least one number) which ... 
- 【LeetCode】Maximum Product Subarray 求连续子数组使其乘积最大
		Add Date 2014-09-23 Maximum Product Subarray Find the contiguous subarray within an array (containin ... 
- 【LeetCode】Maximum Depth of Binary Tree
		http://oj.leetcode.com/problems/maximum-depth-of-binary-tree/ public class Solution { public int max ... 
- 【LeetCode】Maximum Depth of Binary Tree(二叉树的最大深度)
		这道题是LeetCode里的第104道题. 给出题目: 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例: 给定 ... 
- 【LeetCode】Maximum Subarray(最大子序和)
		这道题是LeetCode里的第53道题. 题目描述: 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1 ... 
- 【leetcode】Maximum Product of Word Lengths
		Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the tw ... 
- 【Leetcode】Maximum Product Subarray
		Find the contiguous subarray within an array (containing at least one number) which has the largest ... 
随机推荐
- ASP.NET 大文件下载的实现思路及代码
			文件下载是一个网站最基本的功能,ASP.NET网站的文件下载功能实现也很简单,但是如果遇到大文件的下载而不做特殊处理的话,那将会出现不可预料的后果.本文就基于ASP.NET提供大文件下载的实现思路及代 ... 
- HDU 2007
			/*杭电ACM ID:2007*/ #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() { int in1, in2 ... 
- windows下PHP+Mysql+Apache环境搭建
			Apache版本:httpd-2.2.22-win32-x86-openssl- 下载地址:http://pan.baidu.com/s/1sjuL4RV PHP版 ... 
- 6.3.28微信需群主确认才可进群&发GIF动图功能内测开始了
			昨天下午有网友收到微信6.3.28新版内测邀请,不过这个内部体验目前貌似只对安卓手机开放,苹果的IOS系统还不支持,会提示“你当前使用的是非安卓设备,不建议下载安卓体验包,但你仍可邀请朋友尝鲜”.最新 ... 
- hdu.1430.魔板(bfs + 康托展开)
			魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ... 
- Linux之服务器时间同步
			Linux时间同步(把nameNode1作为时间同步服务器) 设置时区 cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 联网情况:ntpdate ... 
- 【C语言入门教程】2.4 浮点型数据
			浮点型数据又称实型数据,是一个以十进制表示的符号实数.符号实数的值包括整数部分.尾数部分和指数部分. 2.4.1 浮点型常量 一些较大的数值,或者有小数位.指数位的数值都需要用浮点型常量表示.浮点型常 ... 
- HashMap原理分析
			HashMap 实现Map.Cloneable.Serializable接口,继承AbstractMap基类. HashMap map = new HashMap(); 实例化一个HashMap,在构 ... 
- CSU 1328 近似回文词(2013湖南省程序设计竞赛A题)
			题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1328 解题报告:中文题题意就不说了.还好数据不大,只有1000,枚举回文串的中心位置,然 ... 
- nhibernat4.0.0.4000 bug
			//类 NHibernate.Loader.Loader 中 protected virtual string[] ResultRowAliases { get { return null; } } ... 
