LeetCode上第164题,https://leetcode.com/problems/maximum-gap/。
LeetCode上的题都是挺有意思的,不管是不是为了面试个人觉得都值得去刷刷,比如这题使用桶排序巧妙地用O(n)的时间解决了这道题,很有意思。
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace Leetcode 8 { 9 /*桶排序 元素间的最大距离*/ 10 public class MaximumGap 11 { 12 public int maximumGap(int[] nums) 13 { 14 int length = nums.Length; 15 if (length < 2) 16 return 0; 17 Bucket[] buckets = new Bucket[length + 1]; 18 19 //初始化数组 20 for (int i = 0; i < length + 1; i++) 21 { 22 buckets[i].min = int.MaxValue; 23 buckets[i].max = int.MinValue; 24 } 25 26 //找出最大值和最小值 27 int min = nums[0], max = nums[0]; 28 for (int i = 1; i < length; i++) 29 { 30 if (nums[i] > max) 31 max = nums[i]; 32 if (nums[i] < min) 33 min = nums[i]; 34 } 35 /*将每个元素放入到正确的桶中*/ 36 int dis = (max - min) / length + 1;//这个距离怎么去定 37 for (int i = 0; i < length; i++) 38 { 39 int cur; 40 if (nums[i] == max)//最大值的时候特殊处理 41 { 42 cur = length; 43 } 44 else 45 { 46 cur = (nums[i] - min)/dis;//获取桶的下标 47 48 } 49 /*当桶中只有一个元素的收最大值和最小值的值是一样的*/ 50 if (buckets[cur].max < nums[i]) 51 buckets[cur].max = nums[i]; 52 if (buckets[cur].min > nums[i]) 53 buckets[cur].min = nums[i]; 54 } 55 56 /*扫每一个桶 找出最大值,为什么需要length+1只桶,因为length+1只桶内只需要保持一个最大值和最小值就行了,就不需要进行排序了*/ 57 int MaxGap = 0, previous = 0;//previous来记录前一个桶,这种处理方法比较好 58 for (int i = 1; i < buckets.Length; i++) 59 { 60 if (buckets[i].min == int.MaxValue)//代表是空桶 61 continue; 62 if ((buckets[i].min - buckets[previous].max) > MaxGap) 63 { 64 MaxGap = buckets[i].min - buckets[previous].max; 65 } 66 previous = i; 67 } 68 return MaxGap; 69 } 70 } 71 72 public struct Bucket 73 { 74 public int min;//存储每个桶中的最小值 75 public int max;//存储每个桶中的最大值 76 } 77 }