局部最小值的位置对数器,联系

pull/3/head
Leo 5 years ago
parent df1601835e
commit a60a9625ff

@ -1,5 +1,9 @@
package leo.class01; package leo.class01;
import com.sun.org.apache.xpath.internal.functions.FuncFalse;
import leo.util.ArrayUtil;
import sun.security.util.Length;
/** /**
* @author Leo * @author Leo
* @ClassName BSAwesome * @ClassName BSAwesome
@ -36,4 +40,116 @@ public class BSAwesome {
} }
public static int BSAwesome1(int[] arr) {
if (arr.length == 0 || arr == null) {
return -1;
}
if (arr.length == 1||arr[0] < arr[1]) {
return 0;
}
if (arr[arr.length-1]<arr[arr.length-2]){
return arr.length - 1;
}
int L = 1;
int R = arr.length - 2;
int mid = 0;
while (L < R) {
mid = L + ((R - L) >> 1);
if (arr[mid] > arr[mid - 1]) {
R = mid - 1;
} else if (arr[mid] > arr[mid + 1]) {
L = mid + 1;
}else {
return mid;
}
}
return -1;
}
public static int testBSAwesome(int[] arr) {
if (arr.length == 0 || arr == null) {
return -1;
}
if (arr.length >= 1&&arr[0] < arr[1]) {
return 0;
}
if (arr[arr.length - 1] < arr[arr.length - 2]) {
return arr.length - 1;
}
Integer first = null;
Integer end = null;
for (int i = 1; i < arr.length-2; i++) {
int res = arr[i];
if (first == null) {
first = i-1;
}
if (end == null) {
end = i + 1;
}
if (arr[first] > res && res < arr[end]) {
return i;
}
}
return -1;
}
public static int verifyBSAwesome(int[] arr, int index) {
if (arr.length == 0 || index == -1) {
return -1;
}
if (arr.length == 1 && index == 0) {
return index;
}
if (arr.length >= 1 && index == 0 ){
if (index + 1< arr.length && arr[index] < arr[index + 1]) {
return index;
}
}
if (index - 1 >= 0) {
if (index == arr.length-1 ) {
if (arr[index] < arr[index - 1]) {
return index;
}
}
if (index == arr.length - 1) {
if (arr[arr.length - 1] < arr[arr.length - 2]) {
return index;
}
}
if (arr[index - 1] > arr[index] && arr[index] < arr[index + 1]) {
return index;
}
}
return -1;
}
public static void main(String[] arg) {
int maxSize = 80;
int range = 80;
int testTime = 100000;
boolean succeed = true;
for (int i = 0; i < testTime; i++) {
int[] arr = ArrayUtil.randomAdjacentNotEqualArray(maxSize, range);
final int index = BSAwesome1(arr);
final int verifyIndex = verifyBSAwesome(arr,index);
if (index != verifyIndex) {
succeed = false;
ArrayUtil.printArr(arr, "index : " + index + " | testIndex : " + verifyIndex);
break;
}
}
System.out.println(succeed ? "Nice!" : "Fucking Fucked!");
}
} }

@ -1,5 +1,7 @@
package leo.util; package leo.util;
import org.omg.CORBA.IRObject;
import java.util.Arrays; import java.util.Arrays;
/** /**
@ -130,14 +132,14 @@ public class ArrayUtil {
arrName = arrName == null ? "arr" : arrName; arrName = arrName == null ? "arr" : arrName;
arrStr.append(" " + arrName + " = ["); arrStr.append(" " + arrName + " = [");
if (arr == null || arr.length <= 0) { if (arr == null || arr.length <= 0) {
System.out.println();
arrStr.append("]"); arrStr.append("]");
System.out.println(arrStr);
return;
} }
for (int i = 0; i < arr.length; i++) { for (int i = 0; i < arr.length; i++) {
arrStr.append(" " + arr[i] + ","); arrStr.append(" " + arr[i] + (i==arr.length-1?"":","));
} }
arrStr.substring(0, arrStr.length() - 2);
arrStr.append(" ]"); arrStr.append(" ]");
System.out.println(arrStr); System.out.println(arrStr);
} }
@ -154,6 +156,31 @@ public class ArrayUtil {
} }
/**
* :
* @author Leo
* @date 2020/11/13 11:21
* @param maxSize
* @param range
* @return int[]
*/
public static int[] randomAdjacentNotEqualArray(int maxSize, int range) {
int[] arr = new int[(int) ((maxSize + 1) * Math.random())];
Integer preNum = null;
for (int i = 0; i < arr.length; i++) {
int randomNum = (int) ((range + 1) * Math.random() - range * Math.random());
if (preNum != null) {
while (preNum == randomNum) {
randomNum = (int) ((range + 1) * Math.random() - range * Math.random());
}
}
preNum = randomNum;
arr[i] = randomNum;
}
return arr;
}
} }

Loading…
Cancel
Save