Leetcode 剑指系列 Day 16 排序
1.剑指 Offer 45. 把数组排成最小的数
解题思路:
重新将数组排序,最后逐个输入string
排序规则:
防止各数相加过大,利用字符串相加进行比较
若"num1" + “num2” > “num2” + “num1”,将num2排在前面,否则反之
排序用快排
可得到如下代码
class Solution {
public:
void quickSort(vector<int>& nums, int head, int end){
if(head >= end) return;
int i = head, j = end;
int key = nums[head];
while(i < j){
while(i < j && to_string(key) + to_string(nums[j]) <= to_string(nums[j]) + to_string(key)) j--;
if(i < j){
nums[i] = nums[j];
i++;
}
while(i < j && to_string(key) + to_string(nums[i]) >= to_string(nums[i]) + to_string(key)) i++;
if(i < j) {
nums[j] = nums[i];
j--;
}
}
nums[i] = key;
quickSort(nums, head, i - 1);
quickSort(nums, i + 1, end);
}
string minNumber(vector<int>& nums) {
string ans;
quickSort(nums, 0, nums.size() - 1);
for(int i = 0; i < nums.size(); i++){
ans += to_string(nums[i]);
}
return ans;
}
};
2.剑指 Offer 61. 扑克牌中的顺子
解题思路:
先利用快排将5个数重排,重排之后遍历至第1个非0数,并记录之前0的数量为numOfKing;
开始从非0数开始遍历,存在以下几种情况:
1.若已经是第5位,返回true;
2.记录与下一位的差值 k = (nums[i + 1] - nums[i] - 1),若k小于numOfKing,则numOfKinh -= k,然后遍历至下一个节点,否则返回false。
class Solution {
public:
void quickSort(vector<int>& nums, int l, int r){
if(l >= r) return;
int i = l, j = r;
while(i < j) {
while(nums[l] <= nums[j] && i < j) j--;
while(nums[l] >= nums[i] && i < j) i++;
swap(nums[i], nums[j]);
}
swap(nums[i], nums[l]);
quickSort(nums, l, i - 1);
quickSort(nums, i + 1, r);
}
bool isStraight(vector<int>& nums) {
int numOfKing = 0;
quickSort(nums, 0, nums.size() - 1);
for(int i = 0; i < 5;i++){
if(nums[i] == 0) numOfKing++;
else break;
}
for(int i = numOfKing; i < 5; i++){
if(i == 4) break;
int temp = nums[i + 1] - nums[i] - 1;
if(temp == -1) return false;
if(temp <= numOfKing){
numOfKing -= temp;
continue;
}
else return false;
}
return true;
}
};