文章目录
- 一、颜色划分
- 1、题目讲解
- 2、算法原理
- 3、代码实现
- 二、排序数组
- 1、题目讲解
- 2、算法原理
- 3、代码实现
- 三、数组中的第K大元素
- 1、题目讲解
- 2、算法原理
- 3、代码实现
- 四、最小的K个数
- 1、题目讲解
- 2、算法原理
- 3、代码实现
一、颜色划分
1、题目讲解
2、算法原理
3、代码实现
class Solution {
public:
void sortColors(vector<int>& nums)
{
int n=nums.size();
for(int left=-1,right=n,i=0;i<right;)
{
if(nums[i]==1) i++;
else if(nums[i]==0) swap(nums[++left],nums[i++]);
else if(nums[i]==2) swap(nums[--right],nums[i]);
}
}
};
二、排序数组
1、题目讲解
2、算法原理
3、代码实现
class Solution {
public:
vector<int> sortArray(vector<int>& nums)
{
srand(time(NULL));
qsort(nums,0,nums.size()-1);
return nums;
}
void qsort (vector<int>& nums,int l,int r)
{
if(l>=r) return;
int i=l,left=l-1,right=r+1;
int key=GetRandom(nums,l,r);
while(i<right)
{
if(nums[i]<key) swap(nums[++left],nums[i++]);
else if(nums[i]==key) i++;
else swap(nums[--right],nums[i]);
}
qsort(nums,l,left);
qsort(nums,right,r);
}
int GetRandom(vector<int>& nums,int l,int r)
{
int p=rand();
return nums[p%(r-l+1)+l];
}
};
三、数组中的第K大元素
1、题目讲解
2、算法原理
在快排中,当我们把数组「分成三块」之后: [l, left] [left + 1, right - 1] [right, r] ,我们可以通过计算每⼀个区间内元素的「个数」,进⽽推断出我们要找的元素是在「哪⼀个区间」⾥⾯。
那么我们可以直接去「相应的区间」去寻找最终结果就好了。
3、代码实现
class Solution {
public:
int findKthLargest(vector<int>& nums, int k)
{
srand(time(NULL));
return qsort(nums,0,nums.size()-1,k);
}
int qsort(vector<int>& nums,int l,int r,int k)
{
if(l>=r) return nums[l];
int key=GetKey(nums,l,r);
int i=l,left=l-1,right=r+1;
while(i<right)
{
if(nums[i]<key) swap(nums[++left],nums[i++]);
else if(nums[i]==key) i++;
else swap(nums[--right],nums[i]);
}
int c=r-right+1,b=right-left-1;
if(c>=k) return qsort(nums,right,r,k);
else if(c+b>=k) return key;
else return qsort(nums,l,left,k-b-c);
}
int GetKey(vector<int>& nums,int left,int right)
{
return nums[rand()%(right-left+1)+left];
}
};
四、最小的K个数
1、题目讲解
2、算法原理
在快排中,当我们把数组「分成三块」之后: [l, left] [left + 1, right - 1] [right, r] ,我们可以通过计算每⼀个区间内元素的「个数」,进⽽推断出最⼩的 k 个数在哪些区间⾥⾯。
那么我们可以直接去「相应的区间」继续划分数组即可。
3、代码实现
class Solution {
public:
vector<int> smallestK(vector<int>& arr, int k)
{
srand(time(NULL));
qsort(arr,0,arr.size()-1,k);
return {arr.begin(),arr.begin()+k};
}
void qsort(vector<int>& arr,int l,int r,int k)
{
if(l>r) return;
int left=l-1,right=r+1;
int key=GetKey(arr,l,r);
//三路划分
for(int i=l;i<right;)
{
if(arr[i]<key) swap(arr[++left],arr[i++]);
else if(arr[i]==key) i++;
else swap(arr[--right],arr[i]);
}
int a=left-l+1,b=right-left-1;
if(a>k) qsort(arr,l,left,k);
else if(a+b>=k) return;
else qsort(arr,right,r,k-a-b);
}
int GetKey(vector<int>& arr,int l,int r)
{
return arr[rand()%(r-l+1)+l];
}
};