LeetCode

本文介绍了一种使用桶排序解决LeetCode第164题的方法,该方法可在O(n)时间内找到数组中最大元素间差距,避免了传统排序的O(n log n)复杂度。

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 }

 

转载于:https://www.cnblogs.com/FJuly/p/4557320.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值