问题
给5个数,判断是否连续。0可以为任何数。
算法:遍历+抽屉原理
这道题难点在于处理0,它可以为任何数,那么究竟变成什么数呢?
如果纠结这个问题,这道题就会复杂一些。不如换一个问题:不考虑0变成什么数,只考虑非0数有没有可能构成连续数列?因为限定了5个数,如果要连续,则最大数-最小数必须<5
;另外这些数不能重复。也就是说只要非0数满足:
- 最大数-最小数 < 5
- 没有重复数
就能构成连续数列。
乍一看好像这是必要条件而非充分条件,但是结合抽屉原理仔细想想,这其实是充分条件:5个数,非零数值域长度小于5,没有重复数,这样所有的非零数就能构成连续数列的部分,剩下的部分就由0变成即可。
复杂度
$O(N)$
代码
class Solution {
public:
bool isStraight(vector<int>& nums) {
int mi = 14, ma = 0;
unordered_set<int> st;
for(auto x: nums){
if(x == 0) continue;
if(st.count(x)) return false;
st.insert(x);
mi = min(mi, x);
ma = max(ma, x);
}
return ma - mi < 5;
}
};