剑指 Offer 61. 扑克牌中的顺子

从若干副扑克牌中随机抽 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

着急下班,看到这个简单题,懵了一下,后面想到了先进行排序在进行判断上代码
复制代码
class Solution {
public:
    bool isStraight(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        int n = 0;
        for (int i = 0; i < 4; i++) {
            if (nums[i] == 0)
                n++;
            else if (nums[i] >= nums[i + 1])
                return false;
            else if (nums[i] + 1 != nums[i + 1])
                n = n + nums[i] - nums[i + 1] + 1;
        }
        if (n >= 0)
            return true;
        return false;
    }
};
复制代码

c++sort()函数太好用了,但是这样感觉就不知道怎么自己写排序算法了,自己整理了一下排序算法


复制代码
class Solution {
public:
    bool isStraight(vector<int>& nums) {
        //sort(nums.begin(),nums.end());
        //KuaiPai(nums,0, nums.size()-1);
        //MaoPao(nums);
        //XuanZe(nums);
        //ChaRu(nums);
        heapSort(nums,nums.size());
        int n = 0;
        for (int i = 0; i < 4; i++) {
            if (nums[i] == 0)
                n++;
            else if (nums[i] >= nums[i + 1])
                return false;
            else if (nums[i] + 1 != nums[i + 1])
                n = n + nums[i] - nums[i + 1] + 1;
        }
        if (n >= 0)
            return true;
        return false;
    }
    //快速排序
    void KuaiPai(vector<int>& nums,int low,int high) {
        int left = low;
        int right = high;
        if (low > high)
            return;
        int k = nums[left];
        while (left < right) {
            while (nums[right] >= k&&left<right)
            {
                right--;
            }
            nums[left] = nums[right];
            while (nums[left] < k&&left<right)
                left++;
            nums[right] = nums[left];
        }
        nums[left] = k;
        KuaiPai(nums, low, left-1);
        KuaiPai(nums, left+1, high);
    }
    //冒泡排序
    void MaoPao(vector<int>& nums) {
        for (int i = 0; i < nums.size(); i++) {
            for (int j = 0; j < nums.size()-i-1; j++) {
                if (nums[j] > nums[j+1])
                    swap(nums[j], nums[j+1]);
            }
        }
    }
    //选择排序
    void XuanZe(vector<int>& nums) {
        for (int i = 0; i < nums.size(); i++) {
            int min =i;
            for (int j = i+1; j < nums.size(); j++) {
                if (nums[min] > nums[j])
                    min = j;
            }
            swap(nums[i], nums[min]);
        }
    }
    //插入排序
    void ChaRu(vector<int>& nums) {
        for (int i = 1; i < nums.size(); i++) {
            int value = nums[i];
            int postion = i;
            while (postion > 0 && nums[postion - 1] > value) {
                swap(nums[postion], nums[postion-1]);
                postion--;
            }
        }
    }
    //大顶堆排序
    // 递归方式构建大根堆(len是arr的长度,index是第一个非叶子节点的下标)
    void adjust(vector<int> &arr, int len, int index)
    {
        int left = 2 * index + 1; // index的左子节点
        int right = 2 * index + 2;// index的右子节点

        int maxIdx = index;
        if (left<len && arr[left] > arr[maxIdx])     maxIdx = left;
        if (right<len && arr[right] > arr[maxIdx])     maxIdx = right;

        if (maxIdx != index)
        {
            swap(arr[maxIdx], arr[index]);
            adjust(arr, len, maxIdx);
        }
    }
    // 堆排序
    void heapSort(vector<int> &arr, int size)
    {
        // 构建大根堆(从最后一个非叶子节点向上)
        for (int i = size / 2 - 1; i >= 0; i--)
        {
            adjust(arr, size, i);
        }

        // 调整大根堆
        for (int i = size - 1; i >= 1; i--)
        {
            swap(arr[0], arr[i]);           // 将当前最大的放置到数组末尾
            adjust(arr, i, 0);              // 将未完成排序的部分继续进行堆排序
        }
    }
};
复制代码

之前一直没写过堆排序的算法,参考网上的代码,还是比较有难度相比与其他的简单的算法,还有很多例如归并,希尔没写,写不动了,先整理这一些比较基本的吧

 

posted on   4小旧  阅读(45)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示