LeetCode – 846 – 一手顺子 – Java – 双指针嵌套遍历 – 细喔

题目

在这里插入图片描述


题目解析

简单来说 我手上 有一组牌。有 groupSize 张,且又可以分成 groupSize 组,每组都是一个顺子(牌的大小,从左往右,依次加1)。


解题思维

1.既然每组牌都是顺子,那么我们就像牌进行排序(升序)。

在这里插入图片描述


2. 排好了序,就是遍历数组hand,去判断手牌是否groupSize组,每组groupSize 张,且是一个顺子(从左往右,点数依次加一)。

细节:我采用的是双重for循环,外层for循环用来遍历数组(已排序),嵌套的for循环基于外层for循环的基础上(外层循环变量 i = 0, 内层循环变量 j = i + 1),方便我们来比较 相邻的两张牌,是否构成顺子结构【hand[ j ] - hand[ i ] == 1】,而且我们一次比较完后,将 hand[ j ] = -1,因为题目中,我们可以根据案例得知,每张牌在顺子中只能出现一次。

在这里插入图片描述
在这里插入图片描述
跳出内层for‘循环有两个条件,满足任意一个条件即可:
1、 j 遍历完数组(该情况又可以分为两种:1.没有找到满足顺子关系的牌,一直往后走,直到遍历完数组。2.找到满足了顺子关系的第 groupSize 组 最后一张也是最大的一张牌)
2、groupSize组牌,某组牌中,在它的 groupSize 张 牌,满足顺子条件。
最关键的是第二条:如果 count 在内循环结束后,不满足 count == groupSize-1,那么毫无疑问是返回false。而且:也帮我们限制内层循环的次数,加 i 的这一次,刚好是 groupSize 张牌,
细节部分: 内层循环只判断了 1 组牌中 groupSize 张牌是否是顺子。
当 内层循环结束时,且此时内层循环判断的这组牌满足顺子条件( count ==groupSize -1 ),会外层循环,通过一系列操作判断,进行下一组牌的判断。 意味着count 需要重新 计数(count = 0)。


当整个循环结束时,也就是说 满足题目要求(我有一手顺子牌),返回true。

在这里插入图片描述


最后附上程序

class Solution {
    public boolean isNStraightHand(int[] hand, int groupSize) {
        Arrays.sort(hand);
        int n = hand.length;
        int count = 0;
        for(int i = 0; i < n;i++){
            if(hand[i]== -1){//顺子中出现过的牌,直接跳过
                continue;
            }
            count = 0;
            for(int j = i+1; j < n && count != groupSize-1;j++){
                if(hand[j] - hand[i] == count + 1){
                // 判断是否 满足顺子条件:第二张牌 比 第一张牌大一点,第三张比第一张大两点。
                // 以此类推: 第 groupSize张牌,比第一张牌大 groupSize -  1 点
                // 所以 count 就是用来记录 每张牌(除了第一张) 与 第一张牌的大小关系。
                // 顺便可以作为 循环限制条件(数组hand,可以发为 groupSize组 和 每组有 groupSize 张 )
                // 至于为什么要减一,那是因为 第一张牌是用来比较的基准,而且已经 i “拿走了”。
                // 所以我们 只需要判断 hand[i] 后面 groupSize-1 张牌。

                    hand[j] = -1;// 表示这张牌出现过
                    count++;
                }
            }
            if(count != groupSize - 1){// 如果循环结束时,count 的最终结果并不满足顺子条件,返回false。
                return false;
            }
        }
        return true;
        // 整个循环结束时,并且走到这一步,说明 hand 数组,确实可以将牌分为  groupSize组,每组有  groupSize张牌。
        // 且为顺子关系。
    }
}

在这里插入图片描述

代码细节

在这里插入图片描述

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>