Leetcode 剑指系列 Day 16 排序
1.剑指 Offer 45. 把数组排成最小的数
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. 扑克牌中的顺子
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;
}
};