題目連接:
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;
}
}