在有序的数组中找到num
分析
在有序数组中查找num是否存在,最简单最暴力的方法就是我们便利数组,一个一个判断,看是否存在,该方法的时间复杂度为O(n)
如果我们直接在判断中间,可以直接排除一半,在剩下的一半中继续找中间数,又可以排除一半,这就是二分法,二分法的时间复杂度为0(logn)
代码
方法一:暴力破解
public static boolean test(int[] arr, int num) {
for (int cur : arr) {
if (cur == num) {
return true;
}
}
return false;
}
方法二:二分法
public static boolean find(int[] arr, int num) {
// 判断边界
if (arr == null || arr.length < 1) {
return false;
}
int l = 0;
int r = arr.length - 1;
while (l <= r) {
int mid = l + ((r - l) >> 1);
if (arr[mid] == num) {
return true;
} else if (arr[mid] < num) {
l = mid + 1;
} else {
r = mid - 1;
}
}
return false;
}
测试
//创建随机数组
public static int[] generateRandomArray(int maxSize, int maxValue) {
int[] arr = new int[(int) (Math.random() * maxSize)];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int) (maxValue * Math.random());
}
return arr;
}
public static void main(String[] args) {
int testTimes = 1000000;
int maxSize = 10;
int maxValue = 100;
for (int i = 0; i < testTimes; i++) {
int[] ints = generateRandomArray(maxSize, maxValue);
Arrays.sort(ints);
int value = (int) (maxValue * Math.random());
System.out.println(Arrays.toString(ints) + value);
boolean test = test(ints, value);
System.out.println(test);
boolean find = find(ints, value);
System.out.println(find);
if (test != find) {
System.out.println("有误");
}
}
System.out.println("Nice");
}
测试 1000000
次,没有问题,各位放心使用。