1.把数组排成最小的数 力扣
//希尔排序解决的
class Solution {
public:
string minNumber(vector<int>& nums)
{
vector<string> ans;
for (auto sh : nums)
{
ans.push_back(to_string(sh));
}
int gap = nums.size();
while (gap > 1)
{
gap = gap / 2;
for (int i = 0; i < nums.size() - gap; i++)
{
int end = i;
//string tmp = ans[i+gap];
while (end >= 0)
{
if (ans[end] + ans[end + gap] > ans[end + gap] + ans[end])
{
string tmp = ans[end + gap];
ans[end+gap] = ans[end];
ans[end] = tmp;
}
end -= gap;
}
}
}
string ch;
for (auto sh : ans)
ch += sh;
return ch;
}
};
2.普扑克牌中的顺子 力扣
class Solution {
public:
bool isStraight(vector<int>& nums)
{
sort(nums.begin(),nums.end());
int sum=0;
int zenonum=0;
for(int i=0;i<nums.size()-1;i++)
{
//判断零的个数
if(nums[i]==0)
zenonum++;
//判断两个不为零的数字是否相等
if(nums[i]!=0&&nums[i+1]-nums[i]==0)
return false;
//判断差值是否相同
if(nums[i]!=0&&
nums[i+1]-nums[i]>1)
{
sum+=(nums[i+1]-nums[i]-1);
}
}
if(sum>zenonum)
{
return false;
}
else return true;
//简单版本
//return sum<=zenonum;
}
};
3.最小的k的个数 力扣
class Solution
{
public:
vector<int> getLeastNumbers(vector<int>& arr, int k)
{
sort(arr.begin(),arr.end());
vector<int> rearr;
for(int i=0;i<k;i++)
{
//rearr[i]=arr[i];
rearr.push_back(arr[i]);
}
return rearr;
}
};
4.数据流中的中位数 力扣
使用优先级队列来做这道题具体看代码
class MedianFinder
{
priority_queue<int> enter; // 大顶堆
priority_queue<int, vector<int>, greater<int>> go; // 小顶堆
public:
//添加数字到数据结构中
void addNum(int num)
{
enter.push(num); // 加到大顶堆
go.push(enter.top()); // 平衡
enter.pop();
if (enter.size() < go.size())
{ // 维护两个堆元素个数
enter.push(go.top());
go.pop();
}
}
//返回数据结构中的中位数
double findMedian()
{
return enter.size() > go.size() ? (double) enter.top() :
(enter.top() + go.top()) * 0.5;
}
};