桶排序 -- 相邻最大差值,Maximum Gap(leetcode)
来源:互联网 发布:淘宝运费险怎么赔付25 编辑:程序博客网 时间:2024/05/23 02:00
题目描述
请设计一个复杂度为O(n)的算法,计算一个未排序数组中排序后相邻元素的最大差值。
给定一个整数数组A和数组的大小n,请返回最大差值。保证数组元素个数大于等于2小于等于500。
测试样例:
[9,3,1,10],4
返回:6
http://www.nowcoder.com/practice/376ede61d9654bc09dd7d9fa9a4b0bcd?tpId=49&tqId=29366&rp=5&ru=/ta/2016test&qru=/ta/2016test/question-ranking
桶排序自行百度,google
桶排序思路求解
class MaxDivision {public: int findMaxDivision(vector<int> A, int n) { // write code here int minn = A[0]; int maxx = A[0]; for (int i = 1; i < n; i++) { if (A[i] > maxx) maxx = A[i]; if (A[i] < minn) minn = A[i]; } // 分成maxx-minn+1个区间(桶),每个区间只记录最大最小值 vector<int> vmin(n + 1, maxx); vector<int> vmax(n + 1, minn); set<int> notEmpty; // 记录非空桶的下标 共n+1个桶 下标从0到n,避免重复选用了set集合,也能用hash // 最大数 单独一个桶 vmin[n] = maxx; vmax[n] = maxx; notEmpty.insert(n); // 剩下的n-1个数用n个桶,桶区间大小 double bucket = 1.0 * (maxx - minn) / n; // 处理每一个A[i] for (int i = 0; i < n; i++) { if (A[i] == maxx) continue; int pos = (int)(1.0*(A[i] - minn) / bucket); // 得到元素的下标位置 if (A[i] < vmin[pos]) { vmin[pos] = A[i]; } if (A[i] > vmax[pos]){ vmax[pos] = A[i]; } notEmpty.insert(pos); } int rs = 0; // 对于每个非空桶 其最小值减去前面桶的最大值 就是一个结果 set<int>::iterator it = notEmpty.begin(); int p1 = *it; it++; while (it != notEmpty.end()) { int p2 = *it; if ((vmin[p2] - vmax[p1]) > rs) // 对比找到结果 rs = (vmin[p2] - vmax[p1]); p1 = p2; it++; } // 返回结果 return rs; }};
或如下的ac代码
class MaxDivision {public: int findMaxDivision(vector<int> A, int n) { // write code here int minn = A[0]; int maxx = A[0]; for (int i = 1; i < n; i++) { if (A[i] > maxx) maxx = A[i]; if (A[i] < minn) minn = A[i]; } // 分成maxx-minn+1个区间(桶),每个区间只记录最大最小值 vector<int> vmin(n + 1, maxx); vector<int> vmax(n + 1, minn); // 最大数 单独一个桶 vmin[n] = maxx; vmax[n] = maxx; // 剩下的n-1个数用n个桶,桶区间大小 double bucket = 1.0 * (maxx - minn) / n; // 处理每一个A[i] for (int i = 0; i < n; i++) { if (A[i] == maxx) continue; int pos = (int)(1.0*(A[i] - minn) / bucket); // 得到元素的下标位置 if (A[i] < vmin[pos]) { vmin[pos] = A[i]; } if (A[i] > vmax[pos]){ vmax[pos] = A[i]; } } int rs = 0; // 对于每个非空桶 其最小值减去前面桶的最大值 就是一个结果 int pre = 0; // 最小的那个值在第0号桶中 for (int i = 1; i <= n;i++) { if (vmin[i] == maxx && vmax[i] == minn) // 表示这是个空桶 continue; if ((vmin[i] - vmax[pre]) > rs) // 对比找到结果 rs = (vmin[i] - vmax[pre]); pre = i; } // 返回结果 return rs; }};
牛客网解答
http://www.nowcoder.com/questionTerminal/376ede61d9654bc09dd7d9fa9a4b0bcd
其中有把桶区间长度就设为1的,其实就变成了排序了,或者hash了(用数组表示hash也是常用的一种方法)
Maximum Gap(leetcode)
题目地址:
https://leetcode.com/problems/maximum-gap/
ac代码:
class Solution {public: int maximumGap(vector<int>& nums) { int n = nums.size(); if (n < 2) return 0; int minn = nums[0]; int maxx = nums[0]; for (int i = 1; i < n; i++) { if (nums[i] > maxx) maxx = nums[i]; if (nums[i] < minn) minn = nums[i]; } // 分成maxx-minn+1个区间(桶),每个区间只记录最大最小值 vector<int> vmin(n + 1, maxx); vector<int> vmax(n + 1, minn); // 最大数 单独一个桶 vmin[n] = maxx; vmax[n] = maxx; // 剩下的n-1个数用n个桶,桶区间大小 double bucket = 1.0 * (maxx - minn) / n; // 处理每一个元素 for (int i = 0; i < n; i++) { if (nums[i] == maxx) continue; int pos = (int)(1.0*(nums[i] - minn) / bucket); // 得到元素的下标位置 if (nums[i] < vmin[pos]) { vmin[pos] = nums[i]; } if (nums[i] > vmax[pos]){ vmax[pos] = nums[i]; } } int rs = 0; // 对于每个非空桶 其最小值减去前面桶的最大值 就是一个结果 int pre = 0; // 最小的那个值在第0号桶中 for (int i = 1; i <= n; i++) { if (vmin[i] == maxx && vmax[i] == minn) // 表示这是个空桶 continue; if ((vmin[i] - vmax[pre]) > rs) // 对比找到结果 rs = (vmin[i] - vmax[pre]); pre = i; } // 返回结果 return rs; }};
0 0
- 桶排序 -- 相邻最大差值,Maximum Gap(leetcode)
- 排序相关—— 相邻两数的最大差值( Maximum Gap-LeetCode)
- Maximum Gap 寻找数组中排序后相邻两个数的最大差值,桶排序,O(n)
- 相邻最大差值(桶排序)
- 牛客网—相邻最大差值(桶排序)
- 【leetcode 桶排序】Maximum Gap
- [leetcode][桶排序] Maximum Gap
- 求Maximim Gap 排序后的两个相邻元素之间的最大差值
- LeetCode 164. Maximum Gap(最大空隙)
- Leetcode 164 Maximum Gap (最大差距)
- leetcode 164. Maximum Gap 最大间隔 + 一个很好的桶排序示范
- 排序17:相邻两数最大差值
- 【桶排序】MAXIMUM GAP
- UVA - 1644 - Prime Gap(找相邻素数差值)
- [LeetCode] Maximum Gap 最大间隙问题
- Leetcode 164 Maximum Gap 桶排序好题
- 相邻最大差值
- 相邻最大差值
- 数据结构实验之栈三:后缀式求值
- JAVA面向对象的思想
- android back键处理
- iOS开发移除所有子视图
- bzoj3223: Tyvj 1729 文艺平衡树
- 桶排序 -- 相邻最大差值,Maximum Gap(leetcode)
- Struts2中是用拦截器拦截黑名单的demo
- 删除目录及目录里面的文件
- 5W2H七何分析法
- 通讯录动态版本
- Java enum的用法详解
- app引导页(背景图片切换加各个页面动画效果)
- C++ 通过虚函数表,直接外部访问类中的函数,并且脱离类
- 内存字节转成字符串打印