解题报告
排序数组
题目链接:912. 排序数组
题目描述
给你一个整数数组 nums,请你将该数组升序排列。
解题思路
使用qsort函数
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int cmp(const void *p1, const void *p2){
return *(int *)p1 - *(int *)p2;
}
int* sortArray(int* nums, int numsSize, int* returnSize){
qsort(nums, numsSize, sizeof(int), cmp);
*returnSize = numsSize;
return nums;
}
多数元素
题目链接:169. 多数元素
题目描述
给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
解题思路
排序后,数量大于 n / 2 的元素一定出现在数组的中间位置。
int cmp(const void *p1, const void *p2){
return *(int *)p1 - *(int *)p2;
}
int majorityElement(int* nums, int numsSize){
qsort(nums, numsSize, sizeof(int), cmp);
return nums[numsSize / 2];
}
存在重复元素
题目链接:217. 存在重复元素
题目描述
给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。
解题思路
排序后,重复的数一定是相邻的。
int cmp(const void *p1, const void *p2){
return *(int *)p1 - *(int *)p2;
}
bool containsDuplicate(int* nums, int numsSize){
qsort(nums, numsSize, sizeof(int), cmp);
for(int i = 0; i < numsSize - 1; i ++ ){
if(nums[i] == nums[i + 1])
return true;
}
return false;
}
最大间距
题目链接:164. 最大间距
题目描述
给定一个无序的数组 nums,返回 数组在排序之后,相邻元素之间最大的差值 。如果数组元素个数小于 2,则返回 0 。
您必须编写一个在「线性时间」内运行并使用「线性额外空间」的算法
解题思路
升序排序,计算所有相邻数字的差,找到最大值。
int cmp(const void *p1, const void *p2){
return *(int *)p1 - *(int *)p2;
}
int maximumGap(int* nums, int numsSize){
int max = 0;
qsort(nums, numsSize, sizeof(int), cmp);
for(int i = 1; i < numsSize; i ++ ){
if(nums[i] - nums[i - 1] > max)
max = nums[i] - nums[i - 1];
}
return max;
}
按奇偶排序数组
题目链接:905. 按奇偶排序数组
题目描述
给你一个整数数组 nums,将 nums 中的的所有偶数元素移动到数组的前面,后跟所有奇数元素。
返回满足此条件的 任一数组 作为答案。
解题思路
qsort函数按偶数在前,奇数在后排序
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int qua(int x){
return x % 2;
}
int cmp(const void *p1, const void *p2){
return qua(*(int *)p1) - qua(*(int *)p2);
}
int* sortArrayByParity(int* nums, int numsSize, int* returnSize){
qsort(nums, numsSize, sizeof(int), cmp);
*returnSize = numsSize;
return nums;
}
最小时间差
题目链接:539. 最小时间差
题目描述
给定一个 24 小时制(小时:分钟 “HH:MM”)的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。
解题思路
( 1 ) (1) (1) 将时间转换为分钟。
( 2 ) (2) (2) 字符串格式化对应的整数。
( 3 ) (3) (3) 分钟升序排序。
( 4 ) (4) (4) 获取相邻时间差的最小值。
( 5 ) (5) (5) 注意时间的循环。
int cmp(const void *p1, const void *p2){
return *(int *)p1 - *(int *)p2;
}
int findMinDifference(char ** timePoints, int timePointsSize){
int ans = 1440, h = 0, m = 0;
int *ret = (int *)malloc(sizeof(int) * timePointsSize);
for(int i = 0; i < timePointsSize; i ++ ){ //(1)
sscanf(timePoints[i],"%d:%d", &h, &m); //(2)
ret[i] = h * 60 + m;
}
qsort(ret, timePointsSize, sizeof(int), cmp); //(3)
for(int i = 1; i < timePointsSize; i ++){
ans = fmin(ans, ret[i] - ret[i - 1]); //(4)
}
return fmin(ans, ret[0] - ret[timePointsSize - 1] + 1440); //(5)
}
三角形的最大周长
题目链接:976. 三角形的最大周长
题目描述
给定由一些正数(代表长度)组成的数组 nums ,返回 由其中三个长度组成的、面积不为零的三角形的最大周长 。如果不能形成任何面积不为零的三角形,返回 0。
解题思路
数组降序排序,枚举判断是否满足 a + b > c。
int cmp(const void *p1, const void *p2){
return *(int *)p2 - *(int *)p1;
}
int largestPerimeter(int* nums, int numsSize){
qsort(nums, numsSize, sizeof(int), cmp);
for(int i = 0; i < numsSize - 2; i ++ ){
if(nums[i + 1] + nums[i + 2] > nums[i]){
return nums[i] + nums[i + 1] + nums[i + 2];
}
}
return 0;
}
救生艇
题目链接:881. 救生艇
题目描述
给定数组 people 。people[i]表示第 i 个人的体重 ,船的数量不限,每艘船可以承载的最大重量为 limit。
每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit。
返回 承载所有人所需的最小船数
解题思路
( 1 ) (1) (1)按升序排序。
( 2 ) (2) (2)双指针,l 指向最左端即最轻的人,r 指向最右端即最重的人。
( 3 ) (3) (3)两个指针指向同一个位置,说明只剩一个人,船 + 1并跳出循环。
( 4 ) (4) (4)最轻的人和最重的人的相加大于限制,只能重的人单独一条船,r 向右端移一位收缩区间。
( 5 ) (5) (5)最轻的人和最重的人的相加小于限制,两个人同一条船,同时 l 向右、r 向左移一位收缩区间。
int cmp(const void *p1, const void *p2){
return *(int *)p1 - *(int *)p2;
}
int numRescueBoats(int* people, int peopleSize, int limit){
int ans = 0;
qsort(people, peopleSize, sizeof(int), cmp); //(1)
int l = 0, r = peopleSize - 1; //(2)
while(l <= r){
if(l == r){ //(3)
ans ++ ;
break;
}
else if(people[r] + people[l] > limit){ //(4)
ans ++ ;
r -- ;
}else{ //(5)
ans ++ ;
l ++ ;
r -- ;
}
}
return ans;
}