力扣刷题笔记25——扑克牌中的顺子/排序函数sort

扑克牌中的顺子/排序函数sort

  • 问题
  • 我的代码
  • 示例代码
  • sort()
    • 从小到大排序
    • 从大到小排序1-不用第三个参数
    • 从大到小排序2-用第三个参数

问题

来自力扣:

从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,
而大、小王为 0 ,可以看成任意数字。A 不能视为 14。

示例 1:
输入: [1,2,3,4,5]
输出: True

示例 2:
输入: [0,0,1,2,5]
输出: True
 

限制:
数组长度为 5 
数组的数取值为 [0, 13] .

我的代码

#include 
using namespace std;
#include 
#include 
#include
#include 
#include 
#include
#include
#include
#include
#include

class Solution {
public:
	bool isStraight(vector<int>& nums) {
		sort(nums.begin(), nums.end());
		int numszero = 0;
		for (int i = 0; i < 4; ++i) {
			if (nums[i] == 0) {
				numszero++;
			}
			else {
				if (nums[i] == nums[i + 1])
					return false;
			}
		}

		if (nums[4] - nums[numszero] > 4) 
			return false;
		return true;
	}
};

int main() {
	Solution mysolution;
	vector<int> nums = { 0,0,1,2,6 };
	bool knum = mysolution.isStraight(nums);
	cout << knum;
	return 0;
}

思路:要判断五个数字是否是顺子,只需要确保两点,1:最大的数字与最小的数字差值小于4。2:没有重复的数字。
做法1先从大到小排序,2遍历vector,0则记下来;不是0则看看他和下一个数字是否相同,如果相同则肯定不是顺子,直接返回false。3判断非零的数中最大值-最小值是否大于4,大于4肯定也是顺子,直接返回false。4返回true。

示例代码

class Solution {
public:
    bool isStraight(vector<int>& nums) {
        int hash[14]={0};
        int king=0,max_num=0,min_num=14;
        for(int num:nums){
            if(num==0)
                king++;
            else{
                if(hash[num]>=1)
                    return false;
                hash[num]++;
                max_num=max(max_num,num);
                min_num=min(min_num,num);
            }
        }
        if(max_num-min_num<=4)
            return true;
        
        return false;
    }
};

思路是一样的,我就不解释了。
做法的话,它用了用了个表来记录是否有重复的。这个的优点是不需要像我一样去sort,但坏处是占用过多空间。

sort()

上次做了道题(题没啥难的,就没做笔记),我看到里面用了这个函数,而且还自己定义了一个compare函数,所以这次既然用了就顺便记录一下笔记。
功能:排序,默认从小到大排序。
参数:起始位置,结束位置,排序的方法[没有的话就默认是从小到大排序]
需引入的头文件#include

从小到大排序

int main() {
	vector<int> nums = { 10,0,1,7,6 };
	sort(nums.begin(), nums.end());
	for (auto num : nums) {
		cout << num << "\t";
	}
	return 0;
}

在这里插入图片描述

从大到小排序1-不用第三个参数

int main() {
	vector<int> nums = { 10,0,1,7,6 };
	sort(nums.rbegin(), nums.rend());
	for (auto num : nums) {
		cout << num << "\t";
	}
	return 0;
}

力扣刷题笔记25——扑克牌中的顺子/排序函数sort_第1张图片

vector.rbegin(),vector.begin(),vector.rend(),vector.end()这四个的差异如下图:

力扣刷题笔记25——扑克牌中的顺子/排序函数sort_第2张图片

从大到小排序2-用第三个参数

bool compare(int a, int b) {
	return a > b;
}
int main() {
	vector<int> nums = { 10,0,1,7,6 };
	sort(nums.begin(), nums.end(),compare);
	for (auto num : nums) {
		cout << num << "\t";
	}
	return 0;
}

力扣刷题笔记25——扑克牌中的顺子/排序函数sort_第3张图片

你可能感兴趣的:(算法题,leetcode,算法,排序算法)