• LeetCode


    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 }
  • 相关阅读:
    软件工程-个人最终总结
    结对编程—电梯调度
    第三周(第三作业)感想
    周三第二个作业
    VS2013安装和单元测试
    对京东的评价
    简单的四则运算
    迷茫的软件工程
    vlan 和 子网
    ECLIPSE的jar包和文件的导入导出
  • 原文地址:https://www.cnblogs.com/FJuly/p/4557320.html
Copyright © 2020-2023  润新知