题目:给定由一些正数(代表长度)组成的数组 nums ,返回 由其中三个长度组成的、面积不为零的三角形的最大周长 。如果不能形成任何面积不为零的三角形,返回 0。
从序列中找出满足条件(组成三角形)的最优解(最大周长)。这看似是一个NP完全问题,我们可以选择贪心算法得到答案。
int largestPerimeter(vector<int>& nums) {
sort(nums.begin(),nums.end());
for(int i=nums.size()-1;i>=2;i--){
if(nums[i]<nums[i-1]+nums[i-2])
return nums[i] + nums[i-1] + nums[i-2];
}
return 0;
}
该贪心是有最优解的。因为排序完之后 a ≤ b ≤ c a\le b\le c a≤b≤c,所以只需要考虑 a + b > c a+b\gt c a+b>c。
又因为是拍过序的,如果这都不能成立,那么无论a与b在c左侧的序列中怎么挑选都无法满足,如果成立,那么这三个组合一定是从c及其左侧中周长最长的。