有服务器有域名怎么做网站,大数据精准营销的策略,近期时事新闻10条,做网站 哪里发布参考资料#xff1a;力扣K神的讲解
剑指 Offer 61. 扑克牌中的顺子 简单 351 相关企业 从若干副扑克牌中随机抽 5 张牌#xff0c;判断是不是一个顺子#xff0c;即这5张牌是不是连续的。2#xff5e;10为数字本身#xff0c;A为1#xff0c;J为11#xff0c;Q为12力扣K神的讲解
剑指 Offer 61. 扑克牌中的顺子 简单 351 相关企业 从若干副扑克牌中随机抽 5 张牌判断是不是一个顺子即这5张牌是不是连续的。210为数字本身A为1J为11Q为12K为13而大、小王为 0 可以看成任意数字。A 不能视为 14。
示例 1:
输入: [1,2,3,4,5] 输出: True
示例 2:
输入: [0,0,1,2,5] 输出: True
限制
数组长度为 5
数组的数取值为 [0, 13] .
思路 注意到 ‘0’即大王、小王的出现次数只有三种情况
‘0’不出现 此时可行数组顺子的最大值与最小值之差 为 4‘0‘出现一次 此时可行数组顺子的最大值与最小值之差 4’0‘出现两次 此时可行数组顺子的最大值与最小值之差 4 所以顺子应该满足“除了0之外最大值与最小值之差 5”这个数学规律。 此外常识告诉我们顺子不该有重复值。 综上 检查 数组是否可行顺子等价于 检查 “除了0之外最大值与最小值之差 5” 和 ”无重复值“ 这两个条件是否同时满足。
解法一集合找最大值和最小值
使用集合检查数组中是否有重复值 public boolean isStraight(int[] nums) {SetInteger repeat new HashSet();int min14;int max0;for(int i0;inums.length;i){if(nums[i]0){ continue;}min Math.min(nums[i],min);maxMath.max(nums[i],max);if(repeat.contains(nums[i])){return false;}repeat.add(nums[i]);}return max-min5;}解法二排序记录0的个数 public boolean isStraight2(int[] nums) {Arrays.sort(nums);int count00;for(int i0;inums.length-1;i){if(nums[i]0) {count0;continue;}if(nums[i]nums[i1]) return false;// Repeat!!}// 遍历完成后count0 就是 数组最小值所在位置return nums[4]-nums[count0]5;}解法三排序记录0的个数记录空缺数字的个数自己写的つ﹏⊂
我没有观察出来那个数学规律…… 这个解法的思路很朴素。 首先排序然后遍历数组数一下有多少”0“作为救命稻草有多少”缺失值“作为坑 遍历结束之后看看 这些救命稻草 够不够 填补这些坑。 public boolean isStraight1(int[] nums) {Arrays.sort(nums);int count00;// count 0int cnt0;// count all the missing valuesfor(int i0;i5-1;i){if(nums[i]0){count0;}else{if(nums[i]nums[i1]-1){continue;}if(nums[i]nums[i1]) return false;// repeat! cntnums[i1]-nums[i]-1;// say, [2,3],nums[i1]-nums[i]-13-2-10, means no missing value bwt 2 and 3// say, [4,6], nums[i1]-nums[i]6-4-11, means there exists one missing value bwt 4 and 6}}return count0cnt;// check if all available 0 could satisfy the demand of all missing values }