题目连接:
https://www.nowcoder.com/questionTerminal/4b9d1cde452d43a282fad4ff8b2559ea?answerType=1&f=discussion
解题思路:
将数组先进行快速排序,从小到大
然后得到排序后的数组,
如果数组的长度大于等于3,
就取出后三个较大的数,如果两个相对较大的数的和大于最大的数就继续递归判读剩下的数,
此时判断数在数组中对应的下标值会减去已经判断的数
如果当前取出的三个数中两个较小的数的和小于或等于最大的数就返回false;
如果当前每判断的数组中的个数小于三了,直接返回true
public class l022402 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String n=scanner.nextLine();
int num = Integer.parseInt(n);
while (num>0){
String l=scanner.nextLine();
int len=Integer.parseInt(l);
String s = scanner.nextLine();
String[] split = s.split(" ");
int[] nums=new int[split.length];
for (int i = 0; i < nums.length; i++) {
nums[i]=Integer.parseInt(split[i]);
}
if(nums.length==len){
//将数组排序从小到大
sortNums(nums,0,nums.length-1);
boolean f=pandu(nums,len-1);
if(f){
System.out.println("YES");
}else {
System.out.println("NO");
}
}else {
System.out.println("输入的数组长度数值,与输入的数组的实际数组长度不同");;
}
num--;
}
}
private static boolean pandu(int[] nums,int len) {
boolean f=false;
//判断当前数组的数的有效值下标是否大于等于2
if(len<2){//题目中对说了数组长度必须大于等于三,所以不用考虑数组长度小于3的
f=true;
return f;
}
if(len>=2){
//排序完成后取出后面三个较大的数
int f1=nums[len];
int f2=nums[len-1];
int f3=nums[len-2];
//判断第二大与第三大的数的和是否大于最大的数
if(f2+f3>f1){//如果大于递归判断剩下的数
f=pandu(nums,len-3);
}else {
f=false;
return f;
}
}
return f;
}
private static void sortNums(int[] nums,int left,int right) {
int l=left;
int r=right;
int mid=nums[(l+r)/2];
while (l<r){
while (nums[r]>mid){
r--;
}
while (nums[l]<mid){
l++;
}
if(l>=r){
break;
}
swap(nums,l,r);
if(nums[r]==mid){
l+=1;
}
if(nums[l]==mid){
r-=1;
}
}
if(l==r){
l+=1;
r-=1;
}
if(left<r){
//向左递归
sortNums(nums,left,r);
}
if(right>l){
//向右递归
sortNums(nums,l,right);
}
}
private static void swap(int[] nums, int leftIndex, int rightIndex) {
int temp=0;
temp=nums[rightIndex];
nums[rightIndex]=nums[leftIndex];
nums[leftIndex]=temp;
}
}