LeetCode 914卡盘分组
看了官方题解如下:
class Solution {
public boolean hasGroupsSizeX(int[] deck) {
int N = deck.length;
int[] count = new int[10000];
for (int c: deck)
count[c]++;
List<Integer> values = new ArrayList();
for (int i = 0; i < 10000; ++i)
if (count[i] > 0)
values.add(count[i]);
search: for (int X = 2; X <= N; ++X)
if (N % X == 0) {
for (int v: values)
if (v % X != 0)
continue search;
return true;
}
return false;
}
}
我一直在想,如果使用C语言怎么实现 vues.add(count[i]) 这一步,也就是将count[i] > 0 的这一部分存下来,后来参考了其他人的题解写出的C语言的代码,发现真的需要将这些过滤出来么,我不过滤直接进行遍历不是也是可以的么?
bool hasGroupsSizeX(int* deck, int deckSize){
if (deckSize <= 1) {
return false;
}
int i,X;
int N = deckSize;
int count[10000] = {0};
for (i = 0;i < deckSize;i++) {
count[deck[i]]++;
}
for (X = 2;X <= deckSize;X++) {
if (N % X == 0) {
bool flag = 1;
for (i = 0;i < deckSize;i++) {
if (count[i] > 0 && count[i] % X != 0) {
flag = 0;
break;
}
}
if (flag) {
return true;
}
}
}
return false;
}
通过这个实现,我发现我们有时候一直在思考怎么实现A,难道我们真的需要A么,没有A就不可以么,我们直接使用B可以么?好像这个就是我们经常会遇见的X,Y问题,真正要解决的问题是X,问了很多关于Y的问题,思维陷阱,所以我们思考问题的时候一定要跳出来。