文章目录
0. 知识点
- Trick:qsort()排序API的用法
(1)
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*));
(2)int compar(const void *p1, const void *p2);
递增
int cmp(const void *p1, const void *p2) {
return (*(int *)p1) - (*(int *)p2);
}
递减
int cmp(const void *p1, const void *p2) {
return (*(int *)p2) - (*(int *)p1);
}
1. 解题报告:
Q1:912. 排序数组
/**Q1_method_0.0:利用qsort()
* Note: The returned array must be malloced, assume caller calls free().
*/
/*cmp()是新增的函数*/
int cmp(const void *a,const void * b)
{
return *(int *)a-*(int *)b;
}
int* sortArray(int* nums, int numsSize, int* returnSize){
int* ans = (int *)malloc(sizeof(int)*numsSize);/*范式*/
*returnSize = numsSize;
qsort(nums,numsSize, sizeof(int), cmp);
ans = nums;
return ans;
}
Q2:169. 多数元素
int majorityElement(int* nums, int numsSize){
/*条件规定所给的数组总是存在多数元素*/
/*s1:nums排序*/
/*cmp回调*/
int cmp(const void *a,const void * b)
{
return *(int *)a-*(int *)b;
}
qsort(nums,numsSize, sizeof(int), cmp);
/*s2:取中间值*/
return *(nums + numsSize/2);
}
Q3:217. 存在重复元素
bool containsDuplicate(int* nums, int numsSize){
/*s1:先排序*/
int cmp(const void *a,const void * b)
{
return *(int *)a-*(int *)b;
}
qsort(nums,numsSize, sizeof(int), cmp);
/*s2:遍历,寻找相邻两项相等*/
int i;
for(i=1;i<numsSize;++i)
{
if(nums[i]==nums[i-1])
{
return true;
}
}
return false;
}
Q4:164. 最大间距
int maximumGap(int* nums, int numsSize){
/*s1:特殊情况,数组元素个数小于2个*/
if(numsSize < 2)
{
return 0;
}
/*s2:qsort()排序,增序
(假设已是增序,先验假设*(int *)a<*(int *)b*/
int cmp(const void *a,const void * b)
{
return *(int *)a-*(int *)b;
}
qsort(nums,numsSize, sizeof(int), cmp);
/*s3: 遍历,打擂台法*/
int i,max2;
int max = *(nums+1)-*(nums);
for(i = 2;i<numsSize;++i)
{
max2 = *(nums+i)-*(nums+i-1);
/*将该比较大小的功能模块封装成为函数*/
if(max2 > max)
{
max = max2;
}
}
return max;
}
Q5:905. 按奇偶排序数组
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* sortArrayByParity(int* nums, int numsSize, int* returnSize){
/*s1:自定义数组*/
int * ans = (int *)malloc(sizeof(int)*numsSize);
* returnSize = numsSize;
int Qua(int x) {
return x % 2;
}
/*tips:谁排在前,谁在“-”前
*假设演绎法:(1)偶在前,奇在后;
(2)保证增序,需要保证小减大
(3)递减--是大减小
*/
int cmp(const void *p1, const void *p2) {
return Qua(*(int *)p1) - Qua(*(int *)p2);
}
qsort(nums,numsSize,sizeof(int),cmp);
ans = nums;
return ans;
}
Q6:539. 最小时间差
int cmp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
/*将功能模块封装成为函数*/
int min(int a,int b)
{
return a<b?a:b;
}
int findMinDifference(char ** timePoints, int timePointsSize){
/*s0:malloc一个数组*/
int *ret = (int *)malloc(sizeof(int)*timePointsSize);
/*s1:格式转换,将“HH:MM”格式转换为分钟数*/
int i,ans;
int a,b;
for(i=0;i<timePointsSize;++i)
{
sscanf(*(timePoints+i),"%d:%d",&a,&b);
*(ret+i)=a*60+b;
}
/*s2:使用qsort排序*/
qsort(ret,timePointsSize,sizeof(int),cmp);
/*s3:遍历,比较,使用"打擂台"法求最小值*/
ans=*(ret+1)-*(ret);
for(i=2;i<timePointsSize;++i)
{
ans = min(ans,*(ret+i)-*(ret+i-1));
}
/*s4:考虑特殊情况,即排序后的首尾2项
,因为例如[00:00]与[23:59]的时间差实际上是一分钟,所以要使用补码的思想*/
ans = min(ans,(ret[0]+(1440-ret[timePointsSize-1]))%1440);
return ans;
}
Q7:976. 三角形的最大周长
int cmp(const void *a,const void *b)
{
/*递减*/
return *(int *)b-*(int *)a;
}
int largestPerimeter(int* nums, int numsSize){
qsort(nums,numsSize,sizeof(int),cmp);
int i;
for(i=0;i<numsSize-2;++i)
{
if(nums[i+1]+nums[i+2]>nums[i])
return nums[i+1]+nums[i+2]+nums[i];
}
return 0;
}
Q8:881. 救生艇
int cmp(const void *a,const void *b)
{
/*递减*/
return *(int *)b-*(int *)a;
}
int numRescueBoats(int* people, int peopleSize, int limit){
/*递减排序*/
qsort(people,peopleSize,sizeof(int),cmp);
int cnt_ship=0;
int l=0,r=peopleSize-1;
/*Trick:(1)按重量从大到小排列
(2)如果只剩一个即:l = r,船cnt_ship++,break;退出循环
(3)如果首尾相加大于limit,则cnt_ship++,l++;
(4)如果首尾相加小于或等于limit,则cnt_ship++,l++,r--;
*/
while( l <= r )/*控制左右不会出现交错的情况*/
{
if( l == r)
{
cnt_ship++;
break;
}
else if(people[l]+people[r]>limit)/*误:*/
{
cnt_ship++;l++;
}
else
{
cnt_ship++;l++;r--;
}
}
return cnt_ship;
}
2. 思考总结:
(1)程序书写时,字母注意力要在显示屏上,而不是键盘上。while–>whlie,people–>poeple,[ ]–>()。
(2)了解了qsort()排序的用法,需要配合int cmp(const void *a,const void *b)。
(3)对LeetCode更加熟悉。