@ysner
2021-10-26T06:08:55.000000Z
字数 1528
阅读 1350
排序
第一次提交的代码:(快速排序)
class Solution{public int maximumGap(int[] nums){int n=nums.length,ans=0;Arrays.sort(nums);//Arrays.sort()给数组升序排序的内置函数for(int i=0;i<n-1;i++)if(nums[i+1]-nums[i]>ans) ans=nums[i+1]-nums[i];return ans;}}
第二次提交的代码:(桶)
class Solution{public int maximumGap(int[] nums){int n=nums.length;if(n<2) return 0;int Max=-1,Min=Integer.MAX_VALUE,ans=0;for(int i=0;i<n;i++){Max=Math.max(Max,nums[i]);Min=Math.min(Min,nums[i]);}int[] Tmin=new int[n+1];//保存每个桶内数字的最小值Arrays.fill(Tmin,Integer.MAX_VALUE);//Arrays.fill可以把数组内每个元素置为同一指定值int[] Tmax=new int[n+1];//保存每个桶内数字的最大值Arrays.fill(Tmax,-1);int gap=(Max-Min)/n+1;//指每个桶内包含数字的最大范围,+1为防止gap=0for(int i=0;i<n;i++){int id=(nums[i]-Min)/gap;Tmax[id]=Math.max(Tmax[id],nums[i]);Tmin[id]=Math.min(Tmin[id],nums[i]);}int pre=Min;for(int i=0;i<=n;i++){if(Tmax[i]==-1) continue;ans=Math.max(ans,Tmin[i]-pre);//相邻桶之差中取最大值pre=Tmax[i];//pre保存上一个桶的最大值}return ans;}}
第三次提交的代码:(基数排序)
class Solution{public int maximumGap(int[] nums){int n=nums.length;if(n<2) return 0;int Max=-1,ans=0,exp=1;List<ArrayList<Integer>> list=new ArrayList<>();for(int i=0;i<10;i++) list.add(new ArrayList<>());//嵌套List的初始化for(int i=0;i<n;i++) Max=Math.max(Max,nums[i]);while(Max>=exp)//完全是基数排序思想的模拟实现{for(int i=0;i<10;i++) list.set(i,new ArrayList<>());//set修改第i位上List的值for(int i=0;i<n;i++) list.get(nums[i]/exp%10).add(nums[i]);//get读取第i位上的值int id=0;for(int i=0;i<10;i++)for(int j=0;j<list.get(i).size();j++)nums[id++]=list.get(i).get(j);exp*=10;if(exp<=0) break;//防止exp溢出后变为负数,导致死循环}for(int i=0;i<n-1;i++)ans=Math.max(ans,nums[i+1]-nums[i]);return ans;}}
