前言
主要掌握排序,能排序,再加点小处理。
一、希尔排序
通过希尔快速排序,然后做一些判断。
1、源码
//剑指offer.61.扑克牌中的顺子
public boolean isStraight(int[] nums) {
//排序,然后判断
for(int d = nums.length/2;d>0;d = d/2){
for(int i = d;i<nums.length;i++){
if(nums[i] < nums[i-d]){
int j = i -d;
int temp = nums[i];
for(;j>=0 && nums[j] > temp;j=j-d){
nums[j+d] = nums[j];
}
nums[j+d] = temp;
}
}
}
int i = 0,count = 0;
for(;i<nums.length;i++){
if(nums[i] != 0)
break;
count++;
}
for(;i<nums.length-1;i++){
int gap = nums[i+1] - nums[i] - 1;
if(gap < 0 || gap > count)
return false;
else{
count-=gap;
}
}
return true;
}
2、小处理
//剑指offer.61.扑克牌中的顺子
public boolean isStraight(int[] nums) {
//排序,然后判断
for(int d = nums.length/2;d>0;d = d/2){
for(int i = d;i<nums.length;i++){
if(nums[i] < nums[i-d]){
int j = i -d;
int temp = nums[i];
for(;j>=0 && nums[j] > temp;j=j-d){
nums[j+d] = nums[j];
}
nums[j+d] = temp;
}
}
}
int count = 0;
for(int i = 0;i<nums.length-1;i++){
if(nums[i] == 0)
count++;
else if(nums[i] == nums[i+1])
return false;
}
//本来就有序,当最大的牌-最小的排小于5时,则排之间有序。
return nums[4] - nums[count] < 5;
}
总结
对于第二种小改进
1)通过佛for+else if来定位非0元素位置,且判断是否有重复元素。
2)借助数组的有序,直接通过最大减最小来判断就算将0做一个填充,是否有序。