34
34
35
35
<!-- 这里可写通用的实现逻辑 -->
36
36
37
- 顺子不成立的核心条件:
37
+ ** 方法一:遍历 **
38
38
39
- - 存在重复。
40
- - 最大值与最小值的差距超过 4(最大最小值比较不包括 0 在内)。
39
+ 我们首先明确顺子不成立的核心条件:
41
40
42
- 解决方案:
41
+ 1 . 存在非 $0$ 的重复。
42
+ 2 . 最大值与最小值的差距超过 4(最大最小值比较不包括 $0$ 在内)。
43
43
44
- - 数组计数
44
+ 因此,我们可以用一个哈希表或数组 ` vis ` 记录数字是否出现过,用 ` mi ` 和 ` mx ` 记录最大值和最小值。遍历数组,忽略大小王($0$),求出数组的最大、最小值。若最后差值超过 $4$,则无法构成顺子。
45
45
46
- - 用数组 ` t ` 记录是否存在重复的数,存在则直接返回 ` false ` 。
47
- - 遍历数组,忽略大小王(0),求出数组的最大、最小值。若最后差值超过 4,则无法构成顺子,例如:` 5,6,(0),8,10 ` 。
48
-
49
- - 排序
50
- - 声明一个起始指针,初始化为 0。
51
- - 对数组进行排序,并遍历数组:
52
- - 若遍历元素为 0,将起始指针向右移。
53
- - 若遍历元素与相邻元素相同(忽略 0),则绝对不成立,` return false ` 。
54
- - 遍历结束,比较最大值(数组末尾元素)与起始指针所指向的元素,若是两者值相差大于 4,则顺子不成立。
55
- > 起始指针所做的便是找到除 0 之外,数组当中的最小值。
46
+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为数组长度。
56
47
57
48
<!-- tabs:start -->
58
49
63
54
``` python
64
55
class Solution :
65
56
def isStraight (self , nums : List[int ]) -> bool :
66
- t = [ False for _ in range ( 14 )]
67
- max_val, min_val = 0 , 14
68
- for num in nums:
69
- if num == 0 :
57
+ vis = set ()
58
+ mi, mx = inf, - inf
59
+ for x in nums:
60
+ if x == 0 :
70
61
continue
71
- if t[num] :
62
+ if x in vis :
72
63
return False
73
- t[num] = True
74
- max_val = max (max_val, num )
75
- min_val = min (min_val, num )
76
- return max_val - min_val <= 4
64
+ vis.add(x)
65
+ mi = min (mi, x )
66
+ mx = max (mx, x )
67
+ return mx - mi <= 4
77
68
```
78
69
79
70
### ** Java**
@@ -83,79 +74,44 @@ class Solution:
83
74
``` java
84
75
class Solution {
85
76
public boolean isStraight (int [] nums ) {
86
- boolean [] t = new boolean [14 ];
87
- int maxVal = Integer . MIN_VALUE , minVal = Integer . MAX_VALUE ;
88
- for (int num : nums) {
89
- if (num == 0 ) {
77
+ boolean [] vis = new boolean [14 ];
78
+ int mi = 20 , mx = - 1 ;
79
+ for (int x : nums) {
80
+ if (x == 0 ) {
90
81
continue ;
91
82
}
92
- if (t[num ]) {
83
+ if (vis[x ]) {
93
84
return false ;
94
85
}
95
- t[num ] = true ;
96
- maxVal = Math . max(maxVal, num );
97
- minVal = Math . min(minVal, num );
86
+ vis[x ] = true ;
87
+ mi = Math . min(mi, x );
88
+ mx = Math . max(mx, x );
98
89
}
99
- return maxVal - minVal <= 4 ;
90
+ return mx - mi <= 4 ;
100
91
}
101
92
}
102
93
```
103
94
104
- ### ** JavaScript**
105
-
106
- ``` js
107
- /**
108
- * @param {number[]} nums
109
- * @return {boolean}
110
- */
111
- var isStraight = function (nums ) {
112
- let zeroCnt = 0 ;
113
- nums .sort ((a , b ) => a - b);
114
- for (let i = 0 ; i < nums .length - 1 ; i++ ) {
115
- if (nums[i] === 0 ) zeroCnt++ ;
116
- else {
117
- if (nums[i] === nums[i + 1 ]) return false ;
118
- else if (nums[i] === nums[i + 1 ] - 1 ) {
119
- continue ;
120
- } else if (nums[i] >= nums[i + 1 ] - zeroCnt - 1 ) {
121
- zeroCnt-- ;
122
- } else {
123
- return false ;
124
- }
125
- }
126
- if (zeroCnt < 0 ) return false ;
127
- }
128
- return true ;
129
- };
130
- ```
131
-
132
95
### ** C++**
133
96
134
97
``` cpp
135
98
class Solution {
136
99
public:
137
100
bool isStraight(vector<int >& nums) {
138
- if (nums.size() != 5) {
139
- return false;
140
- }
141
-
142
- std::sort(nums.begin(), nums.end());
143
- int zeroNum = 0;
144
- for (int i = 0; i < nums.size(); i++) {
145
- if (nums[i] != 0) {
146
- // 这题的用例中,会出现超过两个0的情况
147
- break;
101
+ bool vis[ 14] {};
102
+ int mi = 20, mx = -1;
103
+ for (int& x : nums) {
104
+ if (x == 0) {
105
+ continue;
148
106
}
149
- zeroNum++;
150
- }
151
-
152
- for (int i = zeroNum; i < nums.size() - 1 ; i++) {
153
- if (nums[i] == nums[i + 1]) {
107
+ if (vis[ x] ) {
154
108
return false;
155
109
}
110
+ vis[ x] = true;
111
+ mi = min(mi, x);
112
+ mx = max(mx, x);
156
113
}
157
-
158
- return nums[4] - nums[zeroNum] <= 4;
114
+ return mx - mi <= 4;
159
115
}
160
116
};
161
117
```
@@ -164,37 +120,63 @@ public:
164
120
165
121
```go
166
122
func isStraight(nums []int) bool {
167
- m := make ( map [int ]struct {})
168
- mi , ma := 14 , 0
169
- for _ , num := range nums {
170
- if num == 0 {
123
+ vis := map[int]bool{}
124
+ mi, mx := 20, -1
125
+ for _, x := range nums {
126
+ if x == 0 {
171
127
continue
172
128
}
173
- if _ , exist := m[num]; exist {
129
+ if vis[x] {
174
130
return false
175
131
}
176
- mi = min (mi, num)
177
- ma = max (ma, num )
178
- m[num] = struct {}{}
132
+ vis[x] = true
133
+ mi = min(mi, x )
134
+ mx = max(mx, x)
179
135
}
180
- return ma -mi < 5
136
+ return mx -mi <= 4
181
137
}
182
138
183
- func max ( x , y int ) int {
184
- if x > y {
185
- return x
139
+ func min(a, b int) int {
140
+ if a < b {
141
+ return a
186
142
}
187
- return y
143
+ return b
188
144
}
189
145
190
- func min ( x , y int ) int {
191
- if x < y {
192
- return x
146
+ func max(a, b int) int {
147
+ if a > b {
148
+ return a
193
149
}
194
- return y
150
+ return b
195
151
}
196
152
```
197
153
154
+ ### ** JavaScript**
155
+
156
+ ``` js
157
+ /**
158
+ * @param {number[]} nums
159
+ * @return {boolean}
160
+ */
161
+ var isStraight = function (nums ) {
162
+ const vis = new Array (14 ).fill (false );
163
+ let mi = 20 ;
164
+ let mx = - 1 ;
165
+ for (const x of nums) {
166
+ if (x == 0 ) {
167
+ continue ;
168
+ }
169
+ if (vis[x]) {
170
+ return false ;
171
+ }
172
+ vis[x] = true ;
173
+ mi = Math .min (mi, x);
174
+ mx = Math .max (mx, x);
175
+ }
176
+ return mx - mi <= 4 ;
177
+ };
178
+ ```
179
+
198
180
### ** TypeScript**
199
181
200
182
``` ts
@@ -236,20 +218,20 @@ impl Solution {
236
218
``` cs
237
219
public class Solution {
238
220
public bool IsStraight (int [] nums ) {
239
- bool [] t = new bool [14 ];
240
- int max_val = 0 , min_val = 14 ;
241
- foreach (var num in nums ) {
242
- if (num == 0 ) {
221
+ bool [] vis = new bool [14 ];
222
+ int mi = 20 , mx = - 1 ;
223
+ foreach (int x in nums ) {
224
+ if (x == 0 ) {
243
225
continue ;
244
226
}
245
- if (t [ num ]) {
227
+ if (vis [ x ]) {
246
228
return false ;
247
229
}
248
- t [ num ] = true ;
249
- max_val = Math .Max ( max_val , num );
250
- min_val = Math .Min ( min_val , num );
230
+ vis [ x ] = true ;
231
+ mi = Math .Min ( mi , x );
232
+ mx = Math .Max ( mx , x );
251
233
}
252
- return max_val - min_val <= 4 ;
234
+ return mx - mi <= 4 ;
253
235
}
254
236
}
255
237
```
0 commit comments