题目描述:
给定由一些正数(代表长度)组成的数组 A,返回由其中三个长度组成的、面积不为零的三角形的最大周长。
如果不能形成任何面积不为零的三角形,返回 0。
示例 1:
输入:[2,1,2]
输出:5
示例 2:
输入:[1,2,1]
输出:0
示例 3:
输入:[3,2,3,4]
输出:10
示例 4:
输入:[3,6,2,3]
输出:8
题解:
关键在于先把数组排序,这里我用了快速排序算法
class Solution {
public int largestPerimeter(int[] A) {
quickSort(A,0,A.length-1); //排序后的数组
for(int i=A.length-1;i>=2;i--){ //从后开始寻找三角形的最大周长
int a=A[i];
int b=A[i-1];
int c=A[i-2];
if(a<b+c){ //两边之和大于第三边构成一个三角形
return a+b+c;
}
}
return 0;
}
//快速排序
private static void quickSort(int[] A, int l, int r) {
// TODO Auto-generated method stub
if(l<r){
int i,j,x;
i=l;
j=r;
x=A[i];
while(i<j){
while(i<j && A[j]>x){
j--; //从右到左找第一个小于X的数
}
if(i<j)
A[i++]=A[j]; //当将右边的值赋给左边时,左边的i+1
while(i<j && A[i]<x){
i++; //从左到右找第一个小于X的数
}
if(i<j)
A[j--]=A[i]; //当将左边的值赋给右边时,左边的j-1
}
A[i]=x;
quickSort(A,l,i-1); //递归调用
quickSort(A,i+1,r); //递归调用
}
}
}