LeetCode解析------846.一手顺子

题目:

爱丽丝有一手(hand)由整数数组给定的牌。

现在她想把牌重新排列成组,使得每个组的大小都是 W,且由 W 张连续的牌组成。

如果她可以完成分组就返回 true,否则返回 false。

示例1:

输入:hand = [1,2,3,6,2,3,4,7,8], W = 3 输出:true
解释:爱丽丝的手牌可以被重新排列为 [1,2,3],[2,3,4],[6,7,8]。

示例2:

输入:hand = [1,2,3,4,5], W = 4 输出:false
解释:爱丽丝的手牌无法被重新排列成几个大小为 4 的组。

简单介绍:
题目:一手顺子
题目难度:中等
使用语言:JAVA。
这道题来自leetcode题库的Ordered Map标签。
如果想要加深对java拥有数据结构类型的理解,特别是Map的理解,做这类型的题是提升很快的。

解题思路:
首先看题、分析题意,我们可以明确2个关键点:
1.一手(hand)张牌可以分组,每个组大小都是W。
2.每组都是由W张连续的牌组成。
既然,我们已经分析出来题目的关键任务了,下面我们就可以开始思考实现了。
我们采用算法与数据结构的思路来剖析一下这题,

数据结构:
要实现对数据的操作,我们要先明确存储数据的数据结构。
该题的数据结构的作用,以从小到大为牌的顺序,统计每张牌的个数。
这里有两种方法,分别是顺序的List表和TreeMap。
在这里我们采用TreeMap,变量命名为count。
因为TreeMap是按键从小到大排序的,而JAVA对TreeMap的封装比较好。

算法:
既然明确了TreeMap作为解决该题的数据结构,我们就可以开始我们的算法分析了。
1.统计每张牌的个数,然后加入TreeMap。
2.统计每组大小为W的顺子,一次统计去掉count内的W张牌。
如果无法统计出W张牌,则返回false,否则,返回true。

代码部分:

class Solution {
    public boolean isNStraightHand(int[] hand, int W) {
    	//无法使各个小组都为W
    	if(hand.length%W!=0) {
    		return false;
    	}
    	else {
    		TreeMap <Integer,Integer> count;
    		count=new TreeMap<>();
    		//卡牌查找,统计每张牌的个数
    		for(int card:hand) {
    			if(!count.containsKey(card)) {
    				count.put(card, 1);
    			}
    			else count.replace(card, count.get(card)+1);
    		}
    		//统计每组大小为W的顺子
    		while(count.size()>0) {
    			int first=count.firstKey();
    			for(int i=first;i<first+W;i++) {
    				if(!count.containsKey(i)) {return false;}
    				if(count.get(i)==1) {count.remove(i);}
    				else count.replace(i, count.get(i)-1);
    			}
    		}
    		return true;
    	}
    }
}

在这里插入图片描述

结语:
晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!晚安!

原创文章 10 获赞 5 访问量 1198

猜你喜欢

转载自blog.csdn.net/weixin_44337475/article/details/105654745