88 合并两个有序数组
方法一:直接使用sort() 打败了26.11%的人
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int index = m;
for (int i = 0; i < n; i++)
nums1[m++]=nums2[i];
sort(nums1.begin(),nums1.end() );
}
};
方法二:使用两个指针,从后往前遍历 打败了99.93 的人
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int index = m + n - 1;
int i = m - 1;
int j = n - 1;
while (j >= 0)
{
nums1[index--] = (i>=0 && nums1[i]> nums2[j]) ? nums1[i--]:nums2[j--];
}
}
};
215 返回第K个最大值
先回忆一下如何用partition进行快排
int partition(vector<int>& nums, int begin, int end){int l = begin + 1;int r = end;int pivot = nums[begin];while (l <= r){while (l<=r&&nums[r]>pivot)r--;while (l <=r&&nums[l]<pivot)l++;if (l >= r)break;swap(nums[l], nums[r]);l++;r--;}swap(nums[begin], nums[r]);return r;}void quickSort(vector<int>& nums,int begin,int end) {if (begin <=end){int pivot = partition(nums, begin,end);quickSort(nums, begin, pivot - 1);quickSort(nums, pivot + 1, end);}}
正确解法
class Solution {
public:
int partition(vector<int>& nums, int begin, int end)
{
int l = begin + 1;
int r = end;
int pivot = nums[begin];
while (l <= r)
{
while (l<=r&&nums[r]<pivot)
r--;
while (l <=r&&nums[l]>pivot)
l++;
if (l >= r)
break;
swap(nums[l], nums[r]);
l++;
r--;
}
swap(nums[begin], nums[r]);
return r;
}
int findKthLargest(vector<int>& nums, int k) {
int l = 0;
int r = nums.size() - 1;
while (true)
{
int pivot = partition(nums, l, r);
if (k - 1 == pivot)
return nums[pivot];
if (pivot < k - 1)
l = pivot + 1;
else
r = pivot - 1;
}
}
};
用大顶堆的方法
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
make_heap(nums.begin(), nums.end());
for (int i = 1; i < k; i++)
{
pop_heap(nums.begin(), nums.end());//把最大的元素移到最后一个元素上,然后对剩下的元素再建一个大顶堆
nums.pop_back(); //将容器中的最后一个元素删除掉
}
return nums[0];
}
};