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的问题,思维陷阱,所以我们思考问题的时候一定要跳出来。

posted @ 2020-03-27 22:18  Paualf  阅读(75)  评论(0编辑  收藏  举报