数组:
- 数组下标都是从0开始的
- 数组内存空间的地址是连续的
- 正是因为数组内存空间的地址是连续的所以我们在删除或者增添元素的时候,就难免要移动其它元素的地址。(一维数组的增删操作时间复杂度为O(n),所以数组不适合做频繁的增删操作)(二维数组不是连续的m*n的地址空间)
二分查找法
二分查找发使用的基础就是数组必须是有序的 。 并且当存在重复元素的时候使用二分查找法返回的元素下标可能不是唯一的。
二分法,一看就会,一写就废。仔细体会。
当什么时候写 while(left<=right) 什么时候写 while(lefe<right)
什么时候是开区间[left,right] 什么时候写[left,right)
二分法的第一种写法
Class Solution{
public int searchInsert(int[] nums,int target){
int n = nums.length;
int left = 0;
int right=n-1; 此时nums[right]代表 数组中的最后一个元素元素,因此应定义为[left,rignt] 闭区间
while(left<=right){
当target存在与闭区间[left,rignt]中时 需写上 <= 号这样不会把最后一个元素丢掉
int meddle = left+(left-right)/2; 为什么写 left+(left-right)/2 而不写 (left + right)/2 ?
if(target>nums[meddle]){
因为 加法 当左右边界较大时容易产生溢出,而减法不会出现这种情况
left=meddle+1;
}else if(targrt<nums[meddle]){
right = meddle-1;
}else{
return meddle;
}
}
return right+1;
}
二分法的第二中写法
Class Solution{
public int searchInsert(int[] nums,int target){
int n = nums.length;
int left = 0;