剑指 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); // 将未完成排序的部分继续进行堆排序 } } };
之前一直没写过堆排序的算法,参考网上的代码,还是比较有难度相比与其他的简单的算法,还有很多例如归并,希尔没写,写不动了,先整理这一些比较基本的吧
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理