cpp
复制代码
class Solution {
public:
void sortColors(vector<int>& nums) {
// 三指针法
int n = nums.size();
int left = -1, right = n, i = 0;
while(i < right)
{
if(nums[i] == 0) swap(nums[++left], nums[i++]);
else if(nums[i] == 2) swap(nums[--right], nums[i]);
else i++;
}
}
};
cpp
复制代码
class Solution {
public:
vector<int> sortArray(vector<int>& nums) {
srand(time(nullptr));
qsort(nums, 0, nums.size()-1);
return nums;
}
void qsort(vector<int>& nums, int left, int right)
{
// 快速排序------三区间[<key][=key][>key]
if(left >= right) return;
// 选择随机数 Key
int key = GetRand(nums, left, right);
// 三指针排法
int i = left, l = left-1, r = right+1;
while(i < r)
{
if(nums[i] < key) swap(nums[++l], nums[i++]);
else if(nums[i] > key) swap(nums[--r], nums[i]);
else i++;
}
// // 开始往下快排
// [left, l][l+1, r-1][r, right]
qsort(nums, left, l);
qsort(nums, r, right);
}
int GetRand(vector<int>& nums, int left, int right)
{
int r = rand();
return nums[r%(right-left+1)+left];
}
};
cpp
复制代码
class Solution {
int GetRand(vector<int>& nums, int left, int right)
{
int r = rand();
return nums[r%(right-left+1) + left];
}
void quickSort(vector<int>& nums, int left, int right)
{
if(left > right)
return;
// 随机数选key
int key = GetRand(nums, left, right);
// 三指针操作法
// [<key][=key][>key]
int l = left-1, i = left, r = right+1;
while(i < r)
{
if(nums[i] < key)
swap(nums[++l], nums[i++]);
else if(nums[i] > key)
swap(nums[--r], nums[i]);
else
i++;
}
// [left, l][l+1, r-1][r, right]
quickSort(nums, left, l);
quickSort(nums, r, right);
}
public:
int findKthLargest(vector<int>& nums, int k) {
srand(time(0));
quickSort(nums, 0, nums.size()-1);
return nums[nums.size() - k];
}
};
cpp
复制代码
class Solution {
private:
int GetRand(vector<int>& nums, int left, int right)
{
int r = rand();
return nums[r%(right-left+1) + left];
}
void quickSort(vector<int>& nums, int left, int right)
{
if(left > right)
return;
// 获取随机数
int key = GetRand(nums, left, right);
// 三指针法
int i = left, l = left-1, r = right+1;
while(i < r)
{
if(nums[i] > key)
swap(nums[--r], nums[i]);
else if(nums[i] < key)
swap(nums[++l], nums[i++]);
else
i++;
}
// []][][]
quickSort(nums, left, l);
quickSort(nums, r, right);
}
public:
vector<int> inventoryManagement(vector<int>& stock, int cnt) {
srand(time(0));
quickSort(stock, 0, stock.size()-1);
vector<int> ret(stock.begin(), stock.begin() + cnt);
return ret;
}
};
cpp
复制代码
class Solution {
int tmp[50010];
private:
int mergeSort(vector<int>& nums, int left, int right)
{
if(left >= right)
return 0;
// 找中间点
int mid = (left+right)>>1;
int ret = 0; // 要返回的结果
// [left, mid][mid+1, right]
// 2. 左边的个数 + 排序 + 右边的个数 + 排序
ret += mergeSort(nums, left, mid);
ret += mergeSort(nums, mid + 1, right);
// 3. 一左一右的个数
int cur1 = left, cur2 = mid + 1, i = 0;
while(cur1 <= mid && cur2 <= right)
{
if(nums[cur1] <= nums[cur2])
tmp[i++] = nums[cur1++];
else
{
ret += (mid - cur1 + 1);
tmp[i++] = nums[cur2++];
}
}
// 4. 处理一下排序
while(cur1 <= mid) tmp[i++] = nums[cur1++];
while(cur2 <= right) tmp[i++] = nums[cur2++];
for(int i = left; i <= right; i++)
nums[i] = tmp[i-left];
return ret;
}
public:
int reversePairs(vector<int>& record) {
return mergeSort(record, 0, record.size()-1);
}
};
cpp
复制代码
class Solution {
vector<int> ret;
vector<int> index; // 记录 nums 下当前元素的原始下标
int tmpNums[50010];
int tmpIndex[50010];
private:
void mergeSort(vector<int>& nums, int left, int right)
{
if(left >= right)
return ;
int mid = (left + right) >> 1;
// [left, mid][mid+1, right]
// 1. 先处理 左右两部分
mergeSort(nums, left, mid);
mergeSort(nums, mid + 1, right);
// 2. 处理一左一右的情况
int cur1 = left, cur2 = mid + 1, i = 0;
while(cur1 <= mid && cur2 <= right)
{
if(nums[cur1] <= nums[cur2])
{
tmpNums[i] = nums[cur2];
tmpIndex[i++] = index[cur2++];
}
else
{
ret[index[cur1]] = right-cur2 + 1;
tmpNums[i] = nums[cur1];
tmpIndex[i++] = index[cur1++];
}
}
// 3. 处理剩下的排序
while(cur1 <= mid)
{
tmpNums[i] = nums[cur1];
tmpIndex[i++] = index[cur1++];
}
while(cur2 <= right)
{
tmpNums[i] = nums[cur2++];
tmpIndex[i++] = index[cur2++];
}
for(int i = left; i <= right; i++)
{
nums[i] = tmpNums[i-left];
index[i] = tmpIndex[i-left];
}
}
public:
vector<int> countSmaller(vector<int>& nums) {
int n = nums.size();
ret.resize(n);
// 初始化 index 按钮
for(int i = 0; i < n; i++)
{
index[i] = i;
}
mergeSort(nums, 0, n-1);
return ret;
}
};
cpp
复制代码
class Solution {
int tmp[50010];
int mergeSort(vector<int>& nums, int left, int right)
{
if(left >= right)
return 0;
//1
int mid = (left + right)>>1;
// [left, mid][mid+1, right]
int ret = 0;
ret += mergeSort(nums, left, mid);
ret += mergeSort(nums, mid + 1, right);
// 2.
int cur1 = left, cur2 = mid +1, i = left;
while(cur1 <= mid) // 降序的情况
{
while(cur2 <= right && nums[cur2] >= nums[cur1]/2.0)
cur2++;
if(cur2 > right)
break;
ret += right - cur2 + 1;
cur1++;
}
// 4.
cur1 = left, cur2 = mid+1;
while(cur1 <= mid && cur2 <= right)
tmp[i++] = nums[cur1]<nums[cur2]? nums[cur2++] : nums[cur1++];
while(cur1 <= mid)
tmp[i++] = nums[cur1++];
while(cur2 <= right)
tmp[i++] = nums[cur2++];
// 5
for(int i = left; i <= right; i++)
nums[i] = tmp[i];
// 6
return ret;
}
public:
int reversePairs(vector<int>& nums) {
return mergeSort(nums, 0, nums.size()-1);
}
};