拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 LeetCode - 846 - 一手顺子 - Java - 双指标嵌套遍历 - 细喔

LeetCode - 846 - 一手顺子 - Java - 双指标嵌套遍历 - 细喔

白鹭 - 2022-02-11 2010 0 0

文章目录

  • 题目
  • 题目决议
  • 解题思维
    • 1.既然每组牌都是顺子,那么我们就像牌进行排序(升序),
    • 2. 排好了序,就是遍历阵列hand,去判断手牌是否groupSize组,每组groupSize 张,且是一个顺子(从左往右,点数依次加一),
    • 当整个回圈结束时,也就是说 满足题目要求(我有一手顺子牌),回传true,
  • 最后附上程序
    • 代码细节

题目

在这里插入图片描述


?

题目决议

细节:我采用的是双重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张牌,
        // 且为顺子关系,
    }
}

在这里插入图片描述

代码细节

在这里插入图片描述

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *