class Solution {
public boolean isStraight(int[] nums) {
//转换成 最大值最小值相差小于5,并且没有重复元素(除大小王)
Set<Integer> set = new HashSet<>();
int min = 13;
int max = 1;
for(int i = 0; i < nums.length; i++){
if(nums[i] == 0) continue;
if(set.contains(nums[i])) return false;
set.add(nums[i]);
min = Math.min(min, nums[i]);
max = Math.max(max, nums[i]);
}
return max - min < 5;
}
}
# 找到重复的数、最大值、最小值
def isStraight(nums):
l = []
# 把最大值设为最小数,最小值设为最大数
max_ = -float('inf')
min_ = float("inf")
for _ in nums:
if _ in l and _ != 0:
return False
if not _ in l:
l.append(_)
# 最大值与最小值只在非零情况下更新
if _ != 0:
max_ = max(max_,_)
min_ = min(min_,_)
if max_-min_ < 5:
return True
return False
class Solution {
// 时间O(N) 空间O(N)
public boolean isStraight(int[] nums) {
HashSet<Integer> s = new HashSet<>();
int min = 0, max = 0;
for (int num : nums) {
if (num == 0) continue;
if (s.contains(num)) return false;
s.add(num);
if (min == 0 || num < min) min = num;
if (max == 0 || num > max) max = num;
}
return max - min < 5;
}
}
时间O(NlogN) 空间O(1)
class Solution {
// 时间O(NlogN) 空间O(1)
public boolean isStraight(int[] nums) {
int cnt = 0;
Arrays.sort(nums);
while (cnt < nums.length && nums[cnt] == 0) cnt++;
for (int i = cnt + 1; i < nums.length; i++) {
if (nums[i] == nums[i-1]) return false;
}
return nums[4] - nums[cnt] < 5;
}
}
var isStraight = function(nums) {
// 1、不存在有重复的数,大小王除外
// 2、最大值 - 最小值 < 5,大小王除外
let set = new Set();
let min = 20, max = -1;
for (let i = 0; i< nums.length; i++) {
if (nums[i] === 0) continue;
if (set.has(nums[i])) return false;
set.add(nums[i])
max = Math.max(nums[i], max);
min = Math.min(nums[i], min);
}
return max - min < 5;
};
class Solution {
public boolean isStraight(int[] nums) {
//总体思路就是找到最大值和最小值 判断相减是否小于5
Arrays.sort(nums);
int zero = 0;
for(int i = 0; i < 4; i ++){
if(nums[i] == 0){
zero++;
}else if(nums[i] == nums[i+1]){
return false;
}
}
return nums[4] - nums[zero] < 5;
int min = 14, max = 0;
Set<Integer> set = new HashSet<Integer>();
for(int num : nums){
if(num == 0){
continue;
}
if(set.contains(num)){
return false;
}
min = Math.min(num,min);
max = Math.max(num,max);
set.add(num);
}
return max - min < 5;
}
}
class Solution {
public boolean isStraight(int[] nums) {
//满足的条件、不能有重复的数字
// 最大值-最小值<5
Set<Integer> set = new HashSet<>();
int max = -1,min = 20;
for (int i = 0;i < nums.length;i++){
//0:代表大王
if (nums[i] == 0) continue;
//有重复的直接返回false;
if (set.contains(nums[i])) return false;
//则添加在结合中
set.add(nums[i]);
//在循环的过程中找出最大值与最小值;直至这个最大值-最小值的结果<5时。
max = Math.max(nums[i],max);
min = Math.min(nums[i],min);
}
return max-min<5;
}
}
//时间复杂度O(n)
class Solution:
def isStraight(self, nums: List[int]) -> bool:
nums.sort() #先排序
i=0
for num in nums:
if num==0: i+=1 #统计0的个数
if i==0: tem = 0 #没有王
elif i==1: tem = 1 #一个王
elif i==2: tem = 2 #二个
elif i==3: tem = 3
else: return True #大于3 直接真
for k in range(tem,4):
if nums[k+1]-nums[k]>1:
i-=nums[k+1]-nums[k]-1 #看王的数量是否满足牌距
if nums[k+1]==nums[k]:return False #相同返回假
if i>=0:return True #查看王的个数
else: return False
#O(n),空间复杂度O(1)
class Solution {
public boolean isStraight(int[] nums) {
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(nums[i], max);
min = Math.min(nums[i], min);
}
return max - min < 5;
}
}
class Solution {
public boolean isStraight(int[] nums) {
Set<Integer> set = new HashSet<>();
int max = 0, min = 14;
for(int num : nums) {
if(num == 0) continue;
// 如果有重复直接退出
if(set.contains(num)) return false;
// 更新最大最小值
max = Math.max(num, max);
min = Math.min(num, min);
set.add(num);
}
// 数学规律,如果 最大值-最小值 < 5则满足条件
return max - min < 5;
}
}
共以下 26 个回答
主要是规则的转换
时间O(N) 空间O(N)
时间O(NlogN) 空间O(1)
时间O(NlogN) 空间O(1)
排序
时间复杂度 O(1
**空间复杂度 O(1) **
时间O(n)
空间O(1)
玩赖皮,怎么能有3个王???,迫于无奈,统计王的个数,剩下非零数进行遍历
时间复杂度O(n),空间复杂度O(1)
时间复杂度 O(n)
时间:O(n),空间:O(n)
时间和空间复杂度都是O(n)
//时间复杂度和空间复杂度都是n& nums) { set;
class Solution {
public:
bool isStraight(vector
unordered_set
int l=15,r=-1;
for(int i=0;i<nums.size();++i){
if(nums[i]0) continue;
else{
l=min(l,nums[i]);
r=max(nums[i],r);
if(set.count(nums[i])) return false;
set.insert(nums[i]);
}
}
return r-l<5;
};