75 颜色分类
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序
使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
输入: [2,0,2,1,1,0]
输出: [0,0,1,1,2,2]
思路:利用三路快排的思想
class Solution {
public:
void sortColors(vector<int>& nums) {
//借鉴三路快排的思想
//[0,lt]都为0 [lt+1,gt-1]都为1 [gt,n)都为2
int lt=-1,gt=nums.size();
for(int i=0; i<gt;)
{
if(nums[i]==0)
{
lt++;
swap(nums[i],nums[lt]);
i++;
}else if(nums[i]==2)
{
gt--;
swap(nums[i],nums[gt]);
}else{
i++;
}
}
}
};
88 合并两个有序数组
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 num1 成为一个有序数组。
输入:
nums1 = [1,2,3], m = 3
nums2 = [2,5,6],n = 3
输出:[1,2,2,3,5,6]
思路:归并排序的归并过程
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int arr[m+n];
int k=0,i=0,j=0;
while(i<m && j<n)
{
//比较两个数组,将比较小的那个数,放到结果中
if(nums1[i]<=nums2[j])
{
arr[k] = nums1[i];
i++;
}else
{
arr[k]=nums2[j];
j++;
}
k++;
}
while(i<m)
{
arr[k] = nums1[i];
i++;
k++;
}
while(j<n)
{
arr[k]=nums2[j];
j++;
k++;
}
nums1.resize(0);
for(int i=0; i<m+n; i++)
nums1.push_back(arr[i]);
}
};
215 寻找第k大元素
在未排序的数组中找到第 k 个最大的元素
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
思想:利用随机化快速排序的partition过程
如果4返回的位置p,那么目标位置>p,就往>p那部分去找,那么对于<p那部分的元素就不需要处理了
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
//利用双路快排的思想,当前标定点的位置就是正确排序后的位置
srand(time(NULL));
if(nums.size()<=1) return nums.size();
int p=partition(nums,0,nums.size()-1);//[0,p)>v (p,n-1]<v
int r = nums.size()-k;
while(true)
{
if(r==p)
return nums[p];
else if(p>r) //目标在[0,p)
p=partition(nums,0,p-1);
else
p=partition(nums,p+1,nums.size()-1);
}
}
int partition(vector<int>& nums,int l,int r)
{
swap(nums[l],nums[rand()%(r-l+1)+l]);//随机快排
//在nums[l..r]之间找到nums[l]的正确位置
int v = nums[l];
//nums[l+1..j]<v arr[j+1..i]>v
int j=l;
for(int i=l+1; i<=r; i++){
if(nums[i]<v){
swap(nums[j+1],nums[i]);
j++;
}
}
swap(nums[l],nums[j]);
return j;
}
};