题目如下:
首次提交,使用了3层循环,结果超时了
func largestPerimeter(nums []int) int {
n:=len(nums)
max:=0
for i:=0;i<n-2;i++{
for j:=i+1;j<n-1;j++{
for k:=j+1;k<n;k++{
if(nums[i]<nums[j]){
nums[i],nums[j]=nums[j],nums[i]
}
if (nums[i]+nums[j]>nums[k])&&nums[i]-nums[j]<nums[k]{
circle:=nums[i]+nums[j]+nums[k]
if circle>max{
max = circle
}
}
}
}
}
return max
}
题目的测试用例真长orz
算法优化思路:要找到最大的三角形周长,可以将数组排序。只用一层循环,第一层循环i从数组最大数遍历到倒数第3小,依次判断nums[i-1]+nums[i-2]>nums[i],之所以不用第二层和第三层循环,是因为如果nums[i-1]和nums[i-2]这两个大小仅次于nums[i]的和都不能大于nums[i],就没有必要判断后面的数了。一旦nums[i-1]+nums[i-2]>nums[i]成立,返回这三个数之和即周长。
func largestPerimeter(nums []int) int {
n:=len(nums)
circle:=0
sort.Ints(nums)
for i:=n-1;i>=2;i--{
if(nums[i-1]+nums[i-2]>nums[i]){
circle:=nums[i-1]+nums[i-2]+nums[i]
return circle
}
}
return circle
}
时间复杂度由O(n^3)降为O(n),提交成功。
Done!