文章目录
912. 排序数组
快排
class Solution {
public:
void quick_sort(vector<int>& nums,int l,int r)
{
if(l>=r) return ;
int x = nums[l+r>>1],i = l-1,j = r+1;
while(i<j)
{
do ++i; while(nums[i]<x);
do --j; while(nums[j]>x);
if(i<j) swap(nums[i],nums[j]);
}
quick_sort(nums,l,j);
quick_sort(nums,j+1,r);
}
vector<int> sortArray(vector<int>& nums) {
quick_sort(nums,0,nums.size()-1);
return nums;
}
};
归并,注意,tmp临时数组要先reserve出空间,否则后面会报错。tmp[k++],这里,因为创建出来的tmp对象他的capacity是0.
class Solution {
public:
void merge_sort(vector<int>& nums,int l,int r,vector<int>& tmp)
{
if(l>=r) return;
int mid = (l+r)>>1;
merge_sort(nums,l,mid,tmp);
merge_sort(nums,mid+1,r,tmp);
int i = l,j = mid+1,k = 0;
while(i<=mid && j<=r)
{
if(nums[i]<=nums[j]) tmp[k++] = nums[i++];
else tmp[k++] = nums[j++];
}
while(i<=mid) tmp[k++] = nums[i++];
while(j<=r) tmp[k++] = nums[j++];
for(int i = l,j = 0;i<=r;i++,j++) nums[i] = tmp[j];
}
vector<int> sortArray(vector<int>& nums) {
vector<int> tmp;
tmp.reserve(nums.size());
merge_sort(nums,0,nums.size()-1,tmp);
return nums;
}
};
88. 合并两个有序数组
逆序双指针
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int i = m-1,j = n-1;
int k = nums1.size()-1;
while(i>=0 && j>=0)
{
if(nums1[i]>nums2[j]) nums1[k--] = nums1[i--];
else nums1[k--] = nums2[j--];
}
while(i>=0) nums1[k--] = nums1[i--];
while(j>=0) nums1[k--] = nums2[j--];
}
};
1037. 有效的回旋镖
思路:向量叉乘,如果是0,那么就是共线的,不为0,就是不共线的三个点
class Solution {
public:
bool isBoomerang(vector<vector<int>>& points) {
vector<int> v1 = {points[0][0]-points[1][0],points[0][1] - points[1][1]};
vector<int> v2 = {points[0][0]-points[2][0],points[0][1] - points[2][1]};
return v1[0]*v2[1] - v1[1]*v2[0]!=0;
}
};
1232. 缀点成线
思路:用叉乘,先求出来两点之间的向量,然后将向量依次叉乘,结尾不为0就不共线。
class Solution {
public:
bool checkStraightLine(vector<vector<int>>& coordinates) {
vector<vector<int>> vec;
for(int i = 1;i<coordinates.size();i++)
vec.push_back({coordinates[i][0]-coordinates[i-1][0],coordinates[i][1] - coordinates[i-1][1]});
for(int i = 1;i<vec.size();i++)
if(vec[i][0]*vec[i-1][1]-vec[i][1]*vec[i-1][0] != 0)
return false;
return true;
}
};