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

云惠网小编 2021年12月31日13:18:53
评论
1650字阅读5分30秒
摘要

文章目录题目题目解析解题思维1.既然每组牌都是顺子,那么我们就像牌进行排序(升序)。2. 排好了序,就是遍历数组hand,去判断手牌是否groupSize组,每组groupSize 张,且是一个顺子(从左往右,点数依次加一)。当整个循环结束时,也就是说 满足题目要求(我有一手顺子牌),返回true。最后附上程序代码细节题目 题目解析 简单来说 我手上 有一组牌。有 groupSize 张,且又可以分成 groupSize 组,每组都是一个顺子(牌的大小,从左往右,依次加1)。 解题思

广告也精彩

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

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

题目

文章目录

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


在这里插入图片描述

在这里插入图片描述

最后附上程序

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

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

题目解析


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

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张牌。
// 且为顺子关系。
}
}

解题思维

在这里插入图片描述

在这里插入图片描述

代码细节

在这里插入图片描述

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



本文转自 https://blog.csdn.net/DarkAndGrey/article/details/122242055

腾讯云618
云惠网小编
SpringCloud -- Config、Bus解析 java

SpringCloud — Config、Bus解析

1、Config1.1、概述简介1. 分布式面临的问题微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。由于每个服务都需要必要...
Java数据结构-了解复杂度 java

Java数据结构-了解复杂度

2.实例分析与计算  四.写在最后  // 计算斐波那契递归fibonacci的时间复杂度 int fibonacci(int N) { return N < 2 ? N : fibonacci...
Java数据结构-认识顺序表 java

Java数据结构-认识顺序表

目录二.顺序表1.概念及结构2.顺序表的实现打印顺序表获取顺序表的有效长度在pos位置新增元素判断是否包含某个元素查找某个元素对应的位置获取/查找pos位置的元素给pos位置的元素...
腾讯云618

发表评论