#include <set>
class Solution {
public:
bool isStraight(vector<int>& nums) {
std::set<int> unique;
int max = 0, min = 14;
for (auto &n: nums) {
if (!n) continue;
if (unique.find(n) != unique.end()) return false;
unique.insert(n);
max = std::max(max, n);
min = std::min(min, n);
}
return max - min < 5;
}
};
class Solution {
public boolean isStraight(int[] nums) {
// 集合
int min = 14;
int max = 0;
Set<Integer> set = new HashSet<>();
for(int i = 0; i < nums.length; i++) {
// 大小王跳过
if(nums[i] == 0) continue;
// 重复必然不是顺子
if(set.contains(nums[i])) return false;
set.add(nums[i]);
max = Math.max(max,nums[i]);
min = Math.min(min,nums[i]);
}
return max - min < 5;
}
}
HashSet<Integer> hashSet = new HashSet<>();
public boolean isStraight(int[] nums) {
int max = 0, min = 14;
for(int num : nums){
if(num == 0) continue;
max = Math.max(max,num);
min = Math.min(min,num);
if(hashSet.contains(num)) return false;
hashSet.add(num);
}
return max - min < 5;
}
class Solution {
public boolean isStraight(int[] nums) {
int max = Integer.MIN_VALUE, min = Integer.MAX_VALUE;
Set<Integer> set = new HashSet<>();
for(int num:nums){
if(num==0) continue;
if(set.contains(num)) return false;
set.add(num);
max = Math.max(max, num);
min = Math.min(min, num);
}
return max-min<=4;
}
}
// Set + 差值(max - min)
class Solution {
public boolean isStraight(int[] nums) {
Set<Integer> set = new HashSet<>();
int max = Integer.MIN_VALUE, min = Integer.MAX_VALUE;
for (int num : nums) {
if (num == 0) continue; //遇到大小王,则跳过
if (set.contains(num)) return false; //顺子不可能有重复的数字
set.add(num);
//计算 max,min
max = Math.max(max, num);
min = Math.min(min, num);
}
return max - min <= 4; //判断是否是顺子,只需判断 max - min <= 4 即可
}
}
class Solution {
public boolean isStraight(int[] nums) {
/*
* 成为一个顺子需要满足两个条件
* 1. 没有重复的数,大小王除外
* 2. 最大的数和最小的数的差小于5
*/
Set<Integer> set = new HashSet<>();
int max = -1, min = 20;
for(int i = 0; i < nums.length; i++){
if(nums[i] == 0) continue;
if(set.contains(nums[i])) return false;
set.add(nums[i]);
max = Math.max(max, nums[i]);
min = Math.min(min, nums[i]);
}
return max - min < 5;
}
}
共以下 25 个回答
“`java
注意重复也不行
class Solution {
public boolean checkDynasty(int[] places) {
int zeroCount = 0;
Arrays.sort(places);
int period = 0;
for (int i = 0; i < 4; i++) { if (places[i] == 0) { zeroCount++; continue; } if (places[i] == places[i + 1]) { return false; } period += places[i + 1] - places[i] - 1;
}
class Solution {
public boolean isStraight(int[] nums) {
int j = 0;
Arrays.sort(nums);
for(int i=0;i<nums.length-1;i++){
if(nums[i]0){
j++;
}else if(nums[i] nums[i + 1]){
return false;
}
}
return nums[4]-nums[j]<5;
}
}
复杂度o(nlogn)
“`java re=new HashSet<>();
class Solution {
public boolean isStraight(int[] nums) {
// 两个条件
// 1.不包含重复数,0除外
// 2.max-min<5,分析一下,会有5张牌,如果最大的-min=5,那他们之间一定相隔 4 张牌,那就不可能构成顺子了。
Set
int max=-1,min=14;
for(int i=0;i
使用了set空间复杂度是O(5), 遍历了数组时间复杂度是O(5)
排序 + 遍历,纯规则。时间复杂度O(nlogn) 空间复杂度O(1)
桶排序找开始的位置,然后通过0的个数以及总个数来判断顺字
时间复杂度为O(n*logn)
空间复杂度为O(1)
“`C++& nums) {
bool isStraight(std::vector
// 排序牌组
std::sort(nums.begin(), nums.end());
}
“`
排序+遍历
忽略0
【思路】要形成顺子的条件为:1. 5张牌中最大最小之差小于5;2. 5张牌中不能有重复。其中0需要特殊处理
【复杂度】为了检测重复用到了c++ STD库的set,所以时间空间复杂度都为O(nlogn)
排序
时间:O(nlogn)
空间:O(1)
MY不是最优
顺子的概念,换成数学条件
思路:只有5张牌,要使其为顺子,则最大值与最小值之差,应该小于5
时间复杂度:O(n) 空间复杂度:O(n)
时间复杂度:O(n)
空间复杂度:O(n)
时间复杂度:O(n)
空间复杂度:O(n)
时间复杂度O(n)
c++实现& nums) { set;
bool isStraight(vector
set
int maxx = -1,minx = 20;
for(int i = 0;i<nums.size();i++)
{
if(nums[i]0)continue;
if(set.count(nums[i]))return false;
set.insert(nums[i]);
maxx = max(nums[i],maxx);
minx = min(nums[i],minx);
}
return maxx-minx<5;
}
时间复杂度:O(n)
空间复杂度:O(n)