文章目录
- 一、颜色划分
- 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];}
};