intcmp(constvoid *a, constvoid *b) { return *(int *)a - *(int *)b; } intlargestPerimeter(int* nums, int numsSize){ qsort(nums, numsSize, sizeof(int), cmp); for(int i = numsSize - 1; i >= 2; i--) { if(nums[i] < nums[i-1] + nums[i-2]) //利用三角形两边之和大于第三边的性质,假设小的两条边为 a 和 b,大的那条为 c,那么必须满足如下等式才能满足它是一个三角形: a + b > c return nums[i] + nums[i-1] + nums[i-2]; } return0; }
这个问题要求最大的三角形周长,那么势必是最大的那条边 c 越大越好,所以我们可以枚举将所有的边按照递增排序,然后逆序枚举最大的那条边 c,去剩下的边里找小的两条边,最好的情况肯定是比 c 小的最大和次大边最优,如果这两条边都不能满足上述不等式,剩下的边也就肯定也不满足了,所以只需要一个循环即可解决问题。