数组基础
数组是存放在连续内存空间上的相同类型数据的集合。
数组的元素是不能删的,只能覆盖
。
C++中二维数组在地址空间上是连续的。
Java二维数组的每一行头结点的地址是没有规则的,更谈不上连续。
704 二分查找
二分法前提:有序,不重复。
解法一:左闭右闭
代码:
package Train;
import java.util.Scanner;
/**
* 二分查找
*/
public class ErFen {
public int search(int[] nums, int target) {
if (target < nums[0] || target > nums[nums.length - 1]) {
return -1;
}
int high = nums.length - 1, low = 0;
while (low <= high) {
// 下面使用了二进制右移,left + right 在某种情况下可能会超过基本类型所能容纳的最大值,
// 而且 >> (位运算) 比 / 运算要快一点
int mid = low + ((high - low) >> 1);
if (nums[mid] == target) {
return mid;
} else if (nums[mid] > target) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return -1;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
ErFen erFen = new ErFen();
while (in.hasNext()) {
String[] str = in.nextLine().split(",");
int[] arr = new int[str.length];
for (int i = 0; i < str.length; i++) {
arr[i] = Integer.parseInt(str[i]);
}
int target = in.nextInt();
System.out.println(erFen.search(arr, target));
}
}
}
技巧:二进制右移 >>
代码中使用了二进制右移,是因为left + right 在某种情况下可能会超过基本类型所能容纳的最大值,而且 >> (位运算) 比 / 运算要快一点,记得以后用上炫技。
解法二:左闭右开
代码:
public int search(int[] nums, int target) {
int high = nums.length, low = 0;
while (low < high) {
// 下面使用了二进制右移,left + right 在某种情况下可能会超过基本类型所能容纳的最大值,
// 而且 >> (位运算) 比 / 运算要快一点
int mid = low + ((high - low) >> 1);
if (nums[mid] == target) {
return mid;
} else if (nums[mid] > target) {
high = mid;
} else {
low = mid + 1;
}
}
return -1;
}