力扣上的题:将数组分成最小总代价的子数组
#include
#include
// 升序排序比较函数,为qsort提供规则
int cmp(const void *a, const void *b) {
return (*(int *)a) - (*(int *)b);
}
// 计算:第一个元素 + 剩余元素中最小的两个元素 之和
// 入参:nums-数组首地址,numsSize-数组元素个数
// 出参:成功返回目标和,失败(长度不足)返回-1
int minimumCost(int *nums, int numsSize) {
// 边界判断:数组长度必须≥3
if (numsSize < 3) {
printf("错误:数组长度不能小于3!
");
return -1;
}
// 对从第二个元素开始的剩余部分进行升序原地排序
qsort(nums + 1, numsSize - 1, sizeof(int), cmp);
// 固定第一个元素 + 剩余部分最小两个元素(排序后前两位)
return nums[0] + nums[1] + nums[2];
}
int main () {
// 测试用例
int nums [] = {5, 3, 1, 2, 4};
int size = sizeof (nums) / sizeof (nums [0]); // 计算数组长度
// 调用函数并接收结果
int result = minimumCost (nums, size);
if (result != -1) { // 仅在成功时输出结果
printf ("第一个元素与剩余最小两元素的和为:%d
", result);
}
// 测试长度不足的情况(可选)
// int nums2[] = {1,2};
// int size2 = 2;
// minimumCost(nums2, size2);
return 0;
}
通过这个题目,又新了解到,两个函数
cmp qsort
qsort是个 “通用排序工具”,它不知道你要排的是整数、字符还是其他类型,所以需要cmp函数告诉它 “怎么比较两个数,谁该在前谁该在后”;(*(int *)a) - (*(int *)b):把两个待比较的数转成整数,用「前数减后数」的结果定顺序:- 结果为负:前数小,放前面(比如 1-3=-2,1 放 3 前面);
- 结果为正:前数大,放后面(比如 3-1=2,3 放 1 后面);
- 结果为 0:两数相等,顺序不变;
- 结论:这个
cmp函数写死了,只要想让qsort从小到大排整数,直接复制用就行。
还有指针的知识








