首页 > 其他分享 >《剑指Offer》-61-扑克牌中的顺子

《剑指Offer》-61-扑克牌中的顺子

时间:2023-08-08 22:11:13浏览次数:38  
标签:point1 return nums Offer 61 point2 diff false 顺子

判断是否为连续的数字,需要额外考虑的情况有一个,就是 0 可以代表任何数字,并且最多出现两次

给出的长度为 5 的数组不一定是顺序

	bool isStraight(vector<int>& nums) {
		sort(nums.begin(), nums.end());
		// 没有 0 的情况

		if (nums[0] == 0) {
			// 只有一个 0 的情况
			if (nums[1] == 0) {

			}
			else {
				// 有两个 0 的情况,必定是从 0 开始?不一定
			}
		}
		else {
			// 没有 0 的情况
		}
	}

分类讨论的想法很快就被否决了,我想到了《剑指Offer》前面的数组题目中涉及到的,利用数组下标,因为很明显,数组下标也是一个连续的数列,可以用于建立一个映射关系

判断连续,一个一个确认,但是很明显由于 0 的特殊存在和规则,从小往大数并不合理,那么就从大往小数,最大的数字一定是确定的!

那么数的过程中出现了对不上的数字怎么办呢?用 0 补,如果有的话,那我怎么知道有没有呢?用一个指针从最左边开始向右移动,排序后的 0 (如果存在)一定在最左边!

那么这道题目的解题思路就出来了,双指针:

head1 头指针初始位置指向最左(最小的)数,head2 尾指针指向最右(最大的)数

head2 从右向左移动,检查下一个数字是否比上一个数字小 1,如果不是,确认差了几个数字,然后去检查左指针指向是否为 0,是 0 就可以补一个向右移动一位表示用掉了(这里差如果大于 2 可以直接 false)

能够补上就继续走,走到两个指针相遇则为 true

不是 0,补不上则为 false

	bool isStraight(vector<int>& nums) {
		sort(nums.begin(), nums.end());
		int point1 = 0, point2 = 3, diff;
		while (point2 != point1) {
			diff = nums[point2] - nums[point2 + 1];
			if (diff > 3) return false;
			while (diff > 1) {
				if (nums[point1] == 0) {
					point1++;
					diff--;
				}
				else return false;
			}
			point2--;
		}
		return true;
	}

死在[0,0,2,2,5]

  1. 没有考虑到元素重复的情况
  2. 差值相减写反了
  3. 最外层while循环退出条件也不对
  4. 若干副牌,不止两张王,那么最极端的情况就是 5 个 0

第一份 AC 代码

	bool isStraight(vector<int>& nums) {
		sort(nums.begin(), nums.end());
		int point1 = 0, point2 = 3, diff;
		if (nums[point2] == 0) return true;
		while (point2 >= point1) {
			if (nums[point2]==0) break;
			diff = nums[point2+1] - nums[point2];
			if (diff > 4 || diff == 0) return false;
			while (diff > 1) {
				if (nums[point1] == 0) {
					point1++;
					diff--;
				}
				else return false;
			}
			point2--;
		}
		return true;
	}

但是这样内存占用率太高

	bool isStraight(vector<int>& nums) {
		sort(nums.begin(), nums.end());
		int point1 = 0, point2 = 3, diff;
		while (point2 >= point1 && nums[point2] != 0) {
			diff = nums[point2+1] - nums[point2];
			if (diff > 4 || diff == 0) return false;
			while (diff > 1) {
				if (nums[point1] == 0) {
					point1++;
					diff--;
				}
				else return false;
			}
			point2--;
		}
		return true;
	}

而且其实也没有用上下标,可能将过程和排序过程结合会更好

标签:point1,return,nums,Offer,61,point2,diff,false,顺子
From: https://www.cnblogs.com/yaocy/p/17615209.html

相关文章

  • 剑指 Offer 28. 对称的二叉树(简单)
    题目:classSolution{public:booltraversal(TreeNode*left,TreeNode*right){//递归判断左右两个**镜像**节点if(left==nullptr&&right!=nullptr)returnfalse;elseif(left!=nullptr&&right==nullptr)returnfalse;el......
  • POJ-3619 Speed Reading
    POJ-3619SpeedReading#include<iostream>usingnamespacestd;typedeflonglongll;#defineIOSios::sync_with_stdio(0);cin.tie(0);cout.tie(0);//#defineiosios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);constintN=1e6+10;......
  • 剑指 Offer 32 - III. 从上到下打印二叉树 III(中等)
    题目:解法一:classSolution{public:voidtraversal(TreeNode*cur,vector<vector<int>>&result,intdepth){if(cur==nullptr)return;if(result.size()==depth)result.push_back(vector<int>());result[depth].pu......
  • Python基础day61 Django choices参数和Ajax技术简介
    choices参数的使用choices是ORM中常用字段的参数作用:类似于一些字段:性别、学历、客户来源、是否上学、是否结婚等有限较少选择的字段我们在表中存储的时候一般使用choices参数,用数字替代文字。案例classCustomer(models.Model):"""客户表"""qq=m......
  • MySQL问题记录Can't connect to MySQL server on 'localhost' (10061)解决方法
    登录MySQL提示Can'tconnecttoMySQLserveron'localhost'(10061)进入安装目录bin目录,执行mysqld--install,启动MySQL点击查看代码cdD:\soft\MySQL\MySQLServer5.7\binmysqld--installnetstartmysql提示启动失败最后执行mysqld--initialize--user=root--......
  • 611-基于VU9P的2路4Gsps AD 2路5G DA PCIe收发卡
    一、板卡概述    基于XCVU9P的5GspsADDA收发PCIe板卡。该板卡要求符合PCIe3.0标准,包含一片XCVU9P-2FLGA2014I、2组64-bit/8GBDDR4、2路高速AD,2路高速DA,支持外触发,外时钟。板卡工作温度范围0到60℃,板卡设计加工包含散热装置,支持服务器风冷散热。软件包括接口测试软件,......
  • JDV背后的技术-助力618
    一、项目介绍JDV(可视化大屏)是京东内部搭建可视化大屏的数据工具平台,内置10+种模版特效,40+种风格各异的图表、导航等组件。与集团其他数据工具打通,支持一站式、自助化、拖拽式搭建大屏,实现数据切换、联动刷新、大屏下钻等呈现效果,便利高管、采销、产研等全集团范围内的数据可视化......
  • 剑指 Offer 32 - I. 从上到下打印二叉树(中等)
    题目://考察BFS(广度优先搜索)classSolution{public:vector<int>levelOrder(TreeNode*root){if(root==nullptr)return{};//一定不要漏了排除空树的情况vector<int>result;deque<TreeNode*>que;//用一个队列,利......
  • 代码随想录算法训练营第七天|力扣334.反转字符串、力扣541.反转字符串II、剑指offer05
    字符串反转字符串(力扣344.)如果题目关键的部分直接用库函数就可以解决,建议不要使用库函数。毕竟面试官一定不是考察你对库函数的熟悉程度,如果使用python和java的同学更需要注意这一点,因为python、java提供的库函数十分丰富。如果库函数仅仅是解题过程中的一小部分,并且......
  • 剑指 Offer 07. 重建二叉树
    classSolution{privateMap<Integer,Integer>indexMap;publicTreeNodemyBuildTree(int[]preorder,int[]inorder,intpreorder_left,intpreorder_right,intinorder_left,intinorder_right){if(preorder_left>preorder_right)......