关于qsort函数如何使用,可以参考一下这位大佬的文章
先来一道简单点的 https://leetcode-cn.com/problems/set-mismatch/
我们可以先对数组进行排序,然后观察数组,发现相邻的两个元素如果相差0,则说明两个元素重复,如果相邻的两个元素相差2,说明缺的元素就是两个元素之间的。有个特殊情况就是当最后两个元素重复时可能不存在相邻元素相差2的情况,最后特判一下就行了。
当然这道题还有更简单的方法,这里我们用sqort函数排序去做。
代码如下:
int cmp(const void *a, const void *b) {
int *a1 = (int*)a;
int *b1 = (int*)b;
return *a1 - *b1;
}
int* findErrorNums(int* nums, int numsSize, int* returnSize){
int *a = (int *)malloc(sizeof(int)*2);
qsort(nums,numsSize,sizeof(nums[0]),cmp);
int pre = 0;
for(int i=0;i<numsSize;i++)
{
if(nums[i] - pre==0)
a[0] = nums[i];
else if(nums[i] - pre==2)
a[1] = pre + 1;
pre = nums[i];
}
if(nums[numsSize-1] != numsSize)
a[1] = numsSize;
* returnSize = 2;
return a;
}
下一题: https://leetcode-cn.com/problems/relative-ranks/
也是一道排序题,不过要和运动员的编号进行捆绑排序 ,还有一个点是力扣答案都是以函数的形式,这道题要返回一个二级指针,一时间不知道这么做了。
代码如下:
int cmp(const void *a, const void *b) {
int *a1 = (int*)a;
int *b1 = (int*)b;
return *a1 - *b1;
}
char *str[] = {"Gold Medal","Silver Medal","Bronze Medal"};
char ** findRelativeRanks(int* score, int scoreSize, int* returnSize){
int arr[scoreSize][2];
/* 存储下标, 并从小到大排序 */
for (int i = 0; i < scoreSize; i++) {
arr[i][0] = -score[i]; /* 取负后从小到大排序 */
arr[i][1] = i;
}
qsort(arr, scoreSize, sizeof(arr[0]), cmp);
/* 从小到大进行输出, 输出到对应下标的字符串中 */
char **res = (char**)malloc(sizeof(char*) * scoreSize);
for (int i = 0; i < scoreSize; i++) {
if (i < 3) {
res[arr[i][1]] = str[i];
} else {
res[arr[i][1]] = (char*)malloc(sizeof(char) * 8);
sprintf(res[arr[i][1]], "%d", i + 1);
}
}
*returnSize = scoreSize;
return res;
}
下一题:https://leetcode-cn.com/problems/boats-to-save-people/
开始没有注意到每搜船最多同时载两人的条件,方向都弄错了。排序完后其实就是一个双指针问题,根据贪心策略,我们优先将最轻的人和最重的人捆绑在一条船上,如果超重,就换次重的人,此时最重的人要单独在一条船上。
int cmp(const void *a,const void *b)
{
return *(int*)a - *(int*)b;
}
int numRescueBoats(int* people, int peopleSize, int limit){
qsort(people,peopleSize,sizeof(people[0]),cmp);
int l = 0,r = peopleSize-1;
int ans = 0;
while(l<=r)
{
if(people[l] + people[r] > limit) r--;
else l++,r--;
ans++;
}
return ans;
}